diff --git a/404.html b/404.html index f98aebffc..6ad9c99cc 100644 --- a/404.html +++ b/404.html @@ -1 +1 @@ -BTD Mod Helper
Not found

Page not found

Sorry 😔 we couldn’t find what you were looking for.

Go home.

\ No newline at end of file +BTD Mod Helper
Not found

Page not found

Sorry 😔 we couldn’t find what you were looking for.

Go home.

\ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Animations.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Animations.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Animations.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Animations.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Bloons.BloonModelUtils.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Bloons.BloonModelUtils.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Bloons.BloonModelUtils.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Bloons.BloonModelUtils.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Bloons.ModBloon.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Bloons.ModBloon.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Bloons.ModBloon.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Bloons.ModBloon.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Bloons.ModBloon_T_.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Bloons.ModBloon_T_.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Bloons.ModBloon_T_.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Bloons.ModBloon_T_.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Bloons.ModRoundSet.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Bloons.ModRoundSet.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Bloons.ModRoundSet.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Bloons.ModRoundSet.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Bloons.ModVanillaBloon.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Bloons.ModVanillaBloon.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Bloons.ModVanillaBloon.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Bloons.ModVanillaBloon.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Bloons.ModVanillaBloons.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Bloons.ModVanillaBloons.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Bloons.ModVanillaBloons.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Bloons.ModVanillaBloons.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.Info.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.Info.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.Info.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.Info.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.InfoPreset.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.InfoPreset.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.InfoPreset.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.InfoPreset.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.MatchLocalPosition.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.MatchLocalPosition.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.MatchLocalPosition.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.MatchLocalPosition.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModGameMenuTracker.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModGameMenuTracker.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModGameMenuTracker.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModGameMenuTracker.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperButton.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperButton.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperButton.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperButton.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperCategory.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperCategory.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperCategory.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperCategory.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperCheckbox.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperCheckbox.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperCheckbox.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperCheckbox.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperComponent.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperComponent.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperComponent.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperComponent.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperComponentExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperComponentExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperComponentExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperComponentExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperDropdown.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperDropdown.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperDropdown.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperDropdown.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperImage.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperImage.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperImage.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperImage.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperInputField.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperInputField.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperInputField.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperInputField.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperOption.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperOption.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperOption.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperOption.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperPanel.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperPanel.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperPanel.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperPanel.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperScrollPanel.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperScrollPanel.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperScrollPanel.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperScrollPanel.json diff --git a/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperSlider.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperSlider.json new file mode 100644 index 000000000..1ede5d61d --- /dev/null +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperSlider.json @@ -0,0 +1 @@ +{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Api.Components

\n

ModHelperSlider Class

\n

ModHelperComponent for a sliding input

\n
public class ModHelperSlider : BTD_Mod_Helper.Api.Components.ModHelperComponent\n
\n

Inheritance UnityEngine.MonoBehaviourModHelperComponent  ModHelperSlider

\n

Fields

\n

\n

ModHelperSlider.defaultValue Field

\n

The Default value, not scaled to anything

\n
public float defaultValue;\n
\n

Field Value

\n

System.Single

\n

Properties

\n

\n

ModHelperSlider.CurrentValue Property

\n

The real current value, scaled by the appropriate scale factor

\n
private float CurrentValue { get; }\n
\n

Property Value

\n

System.Single

\n

\n

ModHelperSlider.DefaultNotch Property

\n

The image showing where the default value is on the slider

\n
public BTD_Mod_Helper.Api.Components.ModHelperImage DefaultNotch { get; }\n
\n

Property Value

\n

ModHelperImage

\n

\n

ModHelperSlider.Fill Property

\n

The panel that's the filled up bar part of the slider

\n
public BTD_Mod_Helper.Api.Components.ModHelperPanel Fill { get; }\n
\n

Property Value

\n

ModHelperPanel

\n

\n

ModHelperSlider.Label Property

\n

The text that's on the notch of the slider

\n
public BTD_Mod_Helper.Api.Components.ModHelperText Label { get; }\n
\n

Property Value

\n

ModHelperText

\n

\n

ModHelperSlider.MaxValue Property

\n

The min value of this slider, adjusted for internal scale factor

\n
private float MaxValue { get; }\n
\n

Property Value

\n

System.Single

\n

\n

ModHelperSlider.MinValue Property

\n

The min value of this slider, adjusted for internal scale factor

\n
private float MinValue { get; }\n
\n

Property Value

\n

System.Single

\n

\n

ModHelperSlider.ScaleFactor Property

\n

The scale factor used for the step size of this slider

\n
public float ScaleFactor { get; set; }\n
\n

Property Value

\n

System.Single

\n

\n

ModHelperSlider.Slider Property

\n

The actual Slider component

\n
public Slider Slider { get; }\n
\n

Property Value

\n

UnityEngine.UI.Slider

\n

Methods

\n

\n

ModHelperSlider.Create(Info, float, float, float, float, Vector2, UnityAction, float, string, Nullable) Method

\n

Creates a new ModHelperSlider

\n
public static BTD_Mod_Helper.Api.Components.ModHelperSlider Create(BTD_Mod_Helper.Api.Components.Info info, float defaultValue, float minValue, float maxValue, float stepSize, Vector2 handleSize, UnityAction<float> onValueChanged=null, float fontSize=42f, string labelSuffix=\"\", System.Nullable<float> startingValue=null);\n
\n

Parameters

\n

\n

info Info

\n

The name/position/size info. NOTE: height must be a set value

\n

\n

defaultValue System.Single

\n

The default slider amount

\n

\n

minValue System.Single

\n

The minimum value of the slider

\n

\n

maxValue System.Single

\n

The maximum value of the slider

\n

\n

stepSize System.Single

\n

What value the slider should increase by per tick

\n

\n

handleSize UnityEngine.Vector2

\n

The height and width of the pip

\n

\n

onValueChanged UnityEngine.Events.UnityAction

\n

Action should happen when the slider changes value, or null

\n

\n

fontSize System.Single

\n

The size of the label text

\n

\n

labelSuffix System.String

\n

String to add to the end of the label, e.g. \"%\"

\n

\n

startingValue System.Nullable<System.Single>

\n

If not null, the value that this should start as instead of the default

\n

Returns

\n

ModHelperSlider

\n

\n

ModHelperSlider.SetCurrentValue(float, bool) Method

\n

Sets the current value of this

\n
public void SetCurrentValue(float value, bool sendCallback=true);\n
\n

Parameters

\n

\n

value System.Single

\n

The new value

\n

\n

sendCallback System.Boolean

\n

Whether the onValueChanged listener should fire

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Api.Components.ModHelperSlider"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperText.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperText.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperText.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ModHelperText.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ScaleOverride.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ScaleOverride.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ScaleOverride.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Components.ScaleOverride.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Coop.MessageUtils.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Coop.MessageUtils.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Coop.MessageUtils.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Coop.MessageUtils.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Data.IModSettings.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Data.IModSettings.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Data.IModSettings.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Data.IModSettings.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Data.ModMultiTextOverride.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Data.ModMultiTextOverride.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Data.ModMultiTextOverride.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Data.ModMultiTextOverride.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Data.ModSettings.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Data.ModSettings.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Data.ModSettings.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Data.ModSettings.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Data.ModTextOverride.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Data.ModTextOverride.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Data.ModTextOverride.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Data.ModTextOverride.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModBloonCustomDisplay.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModBloonCustomDisplay.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModBloonCustomDisplay.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModBloonCustomDisplay.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModBloonCustomDisplay_T_.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModBloonCustomDisplay_T_.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModBloonCustomDisplay_T_.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModBloonCustomDisplay_T_.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModBloonDisplay.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModBloonDisplay.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModBloonDisplay.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModBloonDisplay.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModBloonDisplay_T_.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModBloonDisplay_T_.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModBloonDisplay_T_.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModBloonDisplay_T_.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModBuffIcon.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModBuffIcon.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModBuffIcon.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModBuffIcon.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModCustomDisplay.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModCustomDisplay.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModCustomDisplay.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModCustomDisplay.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModDisplay.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModDisplay.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModDisplay.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModDisplay.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModDisplay2D.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModDisplay2D.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModDisplay2D.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModDisplay2D.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModTowerCustomDisplay.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModTowerCustomDisplay.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModTowerCustomDisplay.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModTowerCustomDisplay.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModTowerCustomDisplay_T_.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModTowerCustomDisplay_T_.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModTowerCustomDisplay_T_.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModTowerCustomDisplay_T_.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModTowerDisplay.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModTowerDisplay.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModTowerDisplay.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModTowerDisplay.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModTowerDisplay_T_.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModTowerDisplay_T_.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Display.ModTowerDisplay_T_.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Display.ModTowerDisplay_T_.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Enums.RoundSetType.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Enums.RoundSetType.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Enums.RoundSetType.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Enums.RoundSetType.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Enums.ScheduleType.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Enums.ScheduleType.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Enums.ScheduleType.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Enums.ScheduleType.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Enums.TowerSetType.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Enums.TowerSetType.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Enums.TowerSetType.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Enums.TowerSetType.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Fonts.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Fonts.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Fonts.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Fonts.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.AbilityHelper.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.AbilityHelper.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.AbilityHelper.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.AbilityHelper.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.ActionHelper.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.ActionHelper.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.ActionHelper.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.ActionHelper.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.AttackHelper.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.AttackHelper.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.AttackHelper.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.AttackHelper.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.CostHelper.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.CostHelper.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.CostHelper.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.CostHelper.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.FileDialogHelper.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.FileDialogHelper.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.FileDialogHelper.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.FileDialogHelper.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.FileIOHelper.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.FileIOHelper.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.FileIOHelper.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.FileIOHelper.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.GameModelExporter.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.GameModelExporter.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.GameModelExporter.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.GameModelExporter.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.Instances.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.Instances.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.Instances.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.Instances.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.Lists.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.Lists.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.Lists.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.Lists.json diff --git a/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.LocalizationHelper.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.LocalizationHelper.json new file mode 100644 index 000000000..92d7b6532 --- /dev/null +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.LocalizationHelper.json @@ -0,0 +1 @@ +{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Api.Helpers

\n

LocalizationHelper Class

\n

Helps mods more easily support additional localization for their mod texts

\n
public class LocalizationHelper\n
\n

Inheritance System.Object  LocalizationHelper

\n

Fields

\n

\n

LocalizationHelper.Cancel Field

\n

\"Cancel\"

\n
public const string Cancel = \"Cancel\";\n
\n

Field Value

\n

System.String

\n

\n

LocalizationHelper.No Field

\n

\"No\"

\n
public const string No = \"DataConsentNo\";\n
\n

Field Value

\n

System.String

\n

\n

LocalizationHelper.Ok Field

\n

\"OK\"

\n
public const string Ok = \"OK\";\n
\n

Field Value

\n

System.String

\n

\n

LocalizationHelper.SearchText Field

\n

\"Search...\"

\n
public const string SearchText = \"SearchText\";\n
\n

Field Value

\n

System.String

\n

\n

LocalizationHelper.Success Field

\n

\"Success!\"

\n
public const string Success = \"Back up Successful!\";\n
\n

Field Value

\n

System.String

\n

\n

LocalizationHelper.Warning Field

\n

\"Warning\"

\n
public const string Warning = \"Warning\";\n
\n

Field Value

\n

System.String

\n

\n

LocalizationHelper.Yes Field

\n

\"Yes\"

\n
public const string Yes = \"DataConsentYes\";\n
\n

Field Value

\n

System.String

\n

Properties

\n

\n

LocalizationHelper.LocalizationDirectory Property

\n

Where Mod Helper imports localizations from

\n
public static string LocalizationDirectory { get; }\n
\n

Property Value

\n

System.String

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Api.Helpers.LocalizationHelper"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.MapHelper.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.MapHelper.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.MapHelper.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.MapHelper.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.MatchScale.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.MatchScale.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.MatchScale.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.MatchScale.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.ModelHelper.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.ModelHelper.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.ModelHelper.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.ModelHelper.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.ModelHelper_T_.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.ModelHelper_T_.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.ModelHelper_T_.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.ModelHelper_T_.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.ProcessHelper.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.ProcessHelper.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.ProcessHelper.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.ProcessHelper.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.ProjectileHelper.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.ProjectileHelper.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.ProjectileHelper.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.ProjectileHelper.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.WeaponHelper.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.WeaponHelper.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Helpers.WeaponHelper.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Helpers.WeaponHelper.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.IModContent.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.IModContent.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.IModContent.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.IModContent.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModByteLoader.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModByteLoader.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModByteLoader.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModByteLoader.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModByteLoader_T_.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModByteLoader_T_.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModByteLoader_T_.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModByteLoader_T_.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModContent.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModContent.json similarity index 67% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModContent.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModContent.json index 671ccbdd3..41099478f 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModContent.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModContent.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Api

\n

ModContent Class

\n

ModContent serves two major purposes:
\n

\n
    \n
  1. It is a base class for things that needs to be loaded via reflection from mods and given Ids,
    \nsuch as ModTower and ModUpgrade\n
    \n
  2. \n
  3. It is a utility class with methods to access instances of those classes and other resources
  4. \n
\n
public abstract class ModContent :\nBTD_Mod_Helper.Api.IModContent,\nSystem.IComparable<BTD_Mod_Helper.Api.ModContent>\n
\n

Inheritance System.Object  ModContent

\n

Derived
\n↳ ModSettings
\n↳ ModTextOverride
\n↳ ModDisplay
\n↳ ModByteLoader
\n↳ ModGameMenu
\n↳ NamedModContent
\n↳ ModVanillaContent

\n

Implements IModContent, System.IComparable<ModContent>

\n

Fields

\n

\n

ModContent.mod Field

\n

The BloonsTD6Mod that this content was added by

\n
public BloonsMod mod;\n
\n

Field Value

\n

BloonsMod

\n

Properties

\n

\n

ModContent.Id Property

\n

The id that this ModContent will be given; a combination of the Mod's prefix and the name

\n
public string Id { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModContent.Name Property

\n

The name that will be at the end of the ID for this ModContent, by default the class name

\n
public virtual string Name { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModContent.Order Property

\n

The order that this ModContent will be loaded/registered in by Mod Helper.
\nUseful for changing the ordering that it will appear in in-game relative to other content of this type in your mod,
\nor for making certain content load before others like may be necessary for sub-towers.
\nDefault/0 will use arbitrary ordering.

\n
protected virtual int Order { get; }\n
\n

Property Value

\n

System.Int32

\n

Methods

\n

\n

ModContent.BloonID() Method

\n

Gets the ID for the given ModBloon

\n
public static string BloonID<T>()\n    where T : BTD_Mod_Helper.Api.Bloons.ModBloon;\n
\n

Type parameters

\n

\n

T

\n

Returns

\n

System.String

\n

\n

ModContent.CreateAudioSourceReference(string) Method

\n

Returns a new AudioSourceReference that uses the given guid

\n
public static AudioSourceReference CreateAudioSourceReference(string guid);\n
\n

Parameters

\n

\n

guid System.String

\n

The guid that you'd like to assign to the AudioSourceReference

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.AudioSourceReference

\n

\n

ModContent.CreateAudioSourceReference(string) Method

\n

Gets an AudioSource reference for a given sound within a mod

\n
public static AudioSourceReference CreateAudioSourceReference<T>(string name)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

The mod

\n

Parameters

\n

\n

name System.String

\n

Sound name (no .wav)

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.AudioSourceReference
\nAn AudioSoundReference

\n

\n

ModContent.CreatePrefabReference(string) Method

\n

Returns a new PrefabReference that uses the given guid

\n
public static PrefabReference CreatePrefabReference(string guid);\n
\n

Parameters

\n

\n

guid System.String

\n

The guid that you'd like to assign to the PrefabReference

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.PrefabReference

\n

\n

ModContent.CreatePrefabReference() Method

\n

Creates a Prefab Reference for a ModDisplay

\n
public static PrefabReference CreatePrefabReference<T>()\n    where T : BTD_Mod_Helper.Api.Display.ModDisplay;\n
\n

Type parameters

\n

\n

T

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.PrefabReference

\n

\n

ModContent.CreateSpriteReference(string) Method

\n

Returns a new SpriteReference that uses the given guid

\n
public static SpriteReference CreateSpriteReference(string guid);\n
\n

Parameters

\n

\n

guid System.String

\n

The guid that you'd like to assign to the SpriteReference

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference

\n

\n

ModContent.Find(string) Method

\n

Finds the loaded ModContent with the given Id and type T

\n
public static T Find<T>(string id)\n    where T : BTD_Mod_Helper.Api.ModContent;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

id System.String

\n

Returns

\n

(string).T\">T

\n

\n

ModContent.GameModeId() Method

\n

Gets the ID for the given ModGameMode

\n
public static string GameModeId<T>()\n    where T : BTD_Mod_Helper.Api.Scenarios.ModGameMode;\n
\n

Type parameters

\n

\n

T

\n

Returns

\n

System.String

\n

\n

ModContent.GetAudioClip(BloonsMod, string) Method

\n

Gets an AudioClip from a mod by its name (no file extension included)

\n
public static AudioClip GetAudioClip(BTD_Mod_Helper.BloonsMod mod, string name);\n
\n

Parameters

\n

\n

mod BloonsMod

\n

The mod

\n

\n

name System.String

\n

Sound name (no .wav)

\n

Returns

\n

UnityEngine.AudioClip
\na playable AudioClip

\n

\n

ModContent.GetAudioClip(string) Method

\n

Gets an AudioClip from this mod by its name (no file extension included)

\n
public AudioClip GetAudioClip(string name);\n
\n

Parameters

\n

\n

name System.String

\n

Sound name (no .wav)

\n

Returns

\n

UnityEngine.AudioClip
\na playable AudioClip

\n

\n

ModContent.GetAudioClip(string) Method

\n

Gets an AudioClip from a mod by its name (no file extension included)

\n
public static AudioClip GetAudioClip<T>(string name)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

The mod

\n

Parameters

\n

\n

name System.String

\n

Sound name (no .wav)

\n

Returns

\n

UnityEngine.AudioClip
\na playable AudioClip

\n

\n

ModContent.GetAudioSourceReference(BloonsMod, string) Method

\n

Gets an AudioSource reference for a given sound within a mod

\n
public static AudioSourceReference GetAudioSourceReference(BTD_Mod_Helper.BloonsMod mod, string name);\n
\n

Parameters

\n

\n

mod BloonsMod

\n

\n

name System.String

\n

Sound name (no .wav)

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.AudioSourceReference
\nAn AudioSoundReference

\n

\n

ModContent.GetAudioSourceReference(string) Method

\n

Gets an AudioSource reference for a given sound within this mod

\n
public AudioSourceReference GetAudioSourceReference(string name);\n
\n

Parameters

\n

\n

name System.String

\n

Sound name (no .wav)

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.AudioSourceReference
\nAn AudioSoundReference

\n

\n

ModContent.GetAudioSourceReference(string) Method

\n

Gets an AudioSource reference for a given sound within a mod

\n
public static AudioSourceReference GetAudioSourceReference<T>(string name)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

The mod

\n

Parameters

\n

\n

name System.String

\n

Sound name (no .wav)

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.AudioSourceReference
\nAn AudioSoundReference

\n

\n

ModContent.GetBundle(BloonsMod, string) Method

\n

Gets a bundle from a mod with the specified name (no file extension)

\n
public static AssetBundle GetBundle(BTD_Mod_Helper.BloonsMod mod, string name);\n
\n

Parameters

\n

\n

mod BloonsMod

\n

\n

name System.String

\n

Returns

\n

UnityEngine.AssetBundle

\n

\n

ModContent.GetBundle(string) Method

\n

Gets a bundle from your mod with the specified name (no file extension)

\n
protected AssetBundle GetBundle(string name);\n
\n

Parameters

\n

\n

name System.String

\n

Returns

\n

UnityEngine.AssetBundle

\n

\n

ModContent.GetBundle(string) Method

\n

Gets a bundle from the mod T with the specified name (no file extension)

\n
public static AssetBundle GetBundle<T>(string name)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

name System.String

\n

Returns

\n

UnityEngine.AssetBundle

\n

\n

ModContent.GetContent() Method

\n

Gets all loaded ModContent objects that are T or a subclass of T

\n
public static System.Collections.Generic.List<T> GetContent<T>()\n    where T : BTD_Mod_Helper.Api.ModContent;\n
\n

Type parameters

\n

\n

T

\n

Returns

\n

System.Collections.Generic.List<().T\">T>

\n

\n

ModContent.GetDisplayGUID() Method

\n

Gets the GUID (thing that should be used in the display field for things) for a specific ModDisplay

\n
public static string GetDisplayGUID<T>()\n    where T : BTD_Mod_Helper.Api.Display.ModDisplay;\n
\n

Type parameters

\n

\n

T

\n

Returns

\n

System.String

\n

\n

ModContent.GetId(BloonsMod, string) Method

\n

Gets the id of a resource by appending the mod's ID prefix to its name

\n
public static string GetId(BTD_Mod_Helper.BloonsMod bloonsMod, string name);\n
\n

Parameters

\n

\n

bloonsMod BloonsMod

\n

\n

name System.String

\n

Returns

\n

System.String

\n

\n

ModContent.GetId(string) Method

\n

Gets the id of a resource by appending the mod's ID prefix to its name

\n
public string GetId(string name);\n
\n

Parameters

\n

\n

name System.String

\n

Returns

\n

System.String

\n

\n

ModContent.GetId(string) Method

\n

Gets the id of a resource by appending the mod's ID prefix to its name

\n
public static string GetId<T>(string name)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

name System.String

\n

Returns

\n

System.String

\n

\n

ModContent.GetInstance(Type) Method

\n

Gets the official instance of a particular ModContent or BloonsTD6Mod based on its type

\n
public static BTD_Mod_Helper.Api.IModContent GetInstance(System.Type type);\n
\n

Parameters

\n

\n

type System.Type

\n

The type to get the instance of

\n

Returns

\n

IModContent
\nThe official instance of it

\n

\n

ModContent.GetInstance() Method

\n

Gets the singleton instance of a particular ModContent or BloonsTD6Mod based on its type

\n
public static T GetInstance<T>()\n    where T : BTD_Mod_Helper.Api.IModContent;\n
\n

Type parameters

\n

\n

T

\n

The type to get the instance of

\n

Returns

\n

().T\">T
\nThe singleton instance of it

\n

\n

ModContent.GetInstances() Method

\n

Gets all loaded ModContent objects that are exactly of type T

\n
public static System.Collections.Generic.List<T> GetInstances<T>()\n    where T : BTD_Mod_Helper.Api.ModContent;\n
\n

Type parameters

\n

\n

T

\n

Returns

\n

System.Collections.Generic.List<().T\">T>

\n

\n

ModContent.GetMod(string) Method

\n

Gets a BloonsTD6Mod by its name, or returns null if none are loaded with that name

\n
public static BTD_Mod_Helper.BloonsMod GetMod(string name);\n
\n

Parameters

\n

\n

name System.String

\n

Returns

\n

BloonsMod

\n

\n

ModContent.GetSprite(BloonsMod, string, float) Method

\n

Constructs a Sprite for a given texture name within a given mod

\n
public static Sprite GetSprite(BTD_Mod_Helper.BloonsMod mod, string name, float pixelsPerUnit=10f);\n
\n

Parameters

\n

\n

mod BloonsMod

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

\n

pixelsPerUnit System.Single

\n

The pixels per unit for the Sprite to have

\n

Returns

\n

UnityEngine.Sprite
\nA Sprite

\n

\n

ModContent.GetSprite(string, float) Method

\n

Constructs a Sprite for a given texture name within this mod

\n
protected Sprite GetSprite(string name, float pixelsPerUnit=10f);\n
\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

\n

pixelsPerUnit System.Single

\n

The pixels per unit for the Sprite to have

\n

Returns

\n

UnityEngine.Sprite
\nA Sprite

\n

\n

ModContent.GetSprite(string, float) Method

\n

Constructs a Sprite for a given texture name within a given mod

\n
public static Sprite GetSprite<T>(string name, float pixelsPerUnit=10f)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

\n

pixelsPerUnit System.Single

\n

The pixels per unit for the Sprite to have

\n

Returns

\n

UnityEngine.Sprite
\nA Sprite

\n

\n

ModContent.GetSpriteReference(BloonsMod, string) Method

\n

Gets a sprite reference by name for a specific mod

\n
public static SpriteReference GetSpriteReference(BTD_Mod_Helper.BloonsMod mod, string name);\n
\n

Parameters

\n

\n

mod BloonsMod

\n

The BloonsTD6Mod that the texture is from

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference
\nA new SpriteReference

\n

\n

ModContent.GetSpriteReference(string) Method

\n

Gets a sprite reference by name for this mod

\n
protected SpriteReference GetSpriteReference(string name);\n
\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference
\nA new SpriteReference

\n

\n

ModContent.GetSpriteReference(string) Method

\n

Gets a sprite reference by name for a specific mod

\n
public static SpriteReference GetSpriteReference<T>(string name)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

Your mod's main BloonsTD6Mod extending class

\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference
\nA new SpriteReference

\n

\n

ModContent.GetSpriteReferenceOrDefault(BloonsMod, string) Method

\n

Gets a sprite reference by name for a specific mod, or if the mod does not include a texture with that name,
\ntreats it as a vanilla sprite reference

\n
public static SpriteReference GetSpriteReferenceOrDefault(BTD_Mod_Helper.BloonsMod mod, string name);\n
\n

Parameters

\n

\n

mod BloonsMod

\n

The BloonsTD6Mod that the texture is from

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference
\nA new SpriteReference

\n

\n

ModContent.GetSpriteReferenceOrDefault(string) Method

\n

Gets a sprite reference by name for a specific mod, or if the mod does not include a texture with that name,
\ntreats it as a vanilla sprite reference

\n
protected SpriteReference GetSpriteReferenceOrDefault(string name);\n
\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference
\nA new SpriteReference

\n

\n

ModContent.GetSpriteReferenceOrDefault(string) Method

\n

Gets a sprite reference by name for a specific mod, or if the mod does not include a texture with that name,
\ntreats it as a vanilla sprite reference

\n
public static SpriteReference GetSpriteReferenceOrDefault<T>(string name)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

Your mod's main BloonsTD6Mod extending class

\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference
\nA new SpriteReference

\n

\n

ModContent.GetSpriteReferenceOrNull(BloonsMod, string) Method

\n

Gets a sprite reference by name for a specific mod, returning null if the texture hasn't currently been
\nloaded instead of an invalid SpriteReference

\n
public static SpriteReference GetSpriteReferenceOrNull(BTD_Mod_Helper.BloonsMod mod, string name);\n
\n

Parameters

\n

\n

mod BloonsMod

\n

The BloonsTD6Mod that the texture is from

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference
\nA new SpriteReference

\n

\n

ModContent.GetSpriteReferenceOrNull(string) Method

\n

Gets a sprite reference by name for this mod, returning null if the texture hasn't currently been
\nloaded instead of an invalid SpriteReference

\n
protected SpriteReference GetSpriteReferenceOrNull(string name);\n
\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference
\nA new SpriteReference

\n

\n

ModContent.GetSpriteReferenceOrNull(string) Method

\n

Gets a sprite reference by name for a specific mod, returning null if the texture hasn't currently been
\nloaded instead of an invalid SpriteReference

\n
public static SpriteReference GetSpriteReferenceOrNull<T>(string name)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

Your mod's main BloonsTD6Mod extending class

\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference
\nA new SpriteReference

\n

\n

ModContent.GetTexture(BloonsMod, string) Method

\n

Constructs a Texture2D for a given texture name within a mod

\n
public static Texture2D GetTexture(BTD_Mod_Helper.BloonsMod bloonsMod, string fileName);\n
\n

Parameters

\n

\n

bloonsMod BloonsMod

\n

The mod that adds this texture

\n

\n

fileName System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

UnityEngine.Texture2D
\nA Texture2D

\n

\n

ModContent.GetTexture(string) Method

\n

Constructs a Texture2D for a given texture name within this mod

\n
protected Texture2D GetTexture(string fileName);\n
\n

Parameters

\n

\n

fileName System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

UnityEngine.Texture2D
\nA Texture2D

\n

\n

ModContent.GetTexture(string) Method

\n

Constructs a Texture2D for a given texture name within a mod

\n
public static Texture2D GetTexture<T>(string fileName)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

fileName System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

UnityEngine.Texture2D
\nA Texture2D

\n

\n

ModContent.GetTextureBytes(BloonsMod, string) Method

\n

Returns the Bytes associated with a texture.

\n
public static byte[] GetTextureBytes(BTD_Mod_Helper.BloonsMod bloonsMod, string fileName);\n
\n

Parameters

\n

\n

bloonsMod BloonsMod

\n

The mod that adds this texture.

\n

\n

fileName System.String

\n

The file name of your texture, without the extension.

\n

Returns

\n

System.Byte[]
\nThe bytes associated with the texture.

\n

\n

ModContent.GetTextureBytes(string) Method

\n

Returns the Bytes associated with a texture.

\n
protected byte[] GetTextureBytes(string fileName);\n
\n

Parameters

\n

\n

fileName System.String

\n

The file name of your texture, without the extension.

\n

Returns

\n

System.Byte[]
\nThe bytes associated with the texture.

\n

\n

ModContent.GetTextureBytes(string) Method

\n

Returns the Bytes associated with a texture.

\n
public static byte[] GetTextureBytes<T>(string fileName)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

fileName System.String

\n

The file name of your texture, without the extension.

\n

Returns

\n

System.Byte[]
\nThe bytes associated with the texture.

\n

\n

ModContent.GetTextureGUID(BloonsMod, string) Method

\n

Gets a texture's GUID by name for a specific mod

\n
public static string GetTextureGUID(BTD_Mod_Helper.BloonsMod mod, string fileName);\n
\n

Parameters

\n

\n

mod BloonsMod

\n

The BloonsTD6Mod that the texture is from

\n

\n

fileName System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

System.String
\nThe texture's GUID

\n

\n

ModContent.GetTextureGUID(string) Method

\n

Gets a texture's GUID by name for this mod
\n

\nReturns null if a Texture hasn't been loaded with that name

\n
public string GetTextureGUID(string name);\n
\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

System.String
\nThe texture's GUID

\n

\n

ModContent.GetTextureGUID(string) Method

\n

Gets a texture's GUID by name for a specific mod, to be used in SpriteReferences
\n

\nReturns null if a Texture hasn't been loaded with that name

\n
public static string GetTextureGUID<T>(string name)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

Your mod's main BloonsTD6Mod extending class

\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

System.String
\nThe texture's GUID

\n

\n

ModContent.GetTowerModel(int, int, int) Method

\n

Gets the TowerModel for a ModTower at a specific tier level

\n
public static TowerModel GetTowerModel<T>(int top=0, int mid=0, int bot=0)\n    where T : BTD_Mod_Helper.Api.Towers.ModTower;\n
\n

Type parameters

\n

\n

T

\n

The ModTower type

\n

Parameters

\n

\n

top System.Int32

\n

The top path tier

\n

\n

mid System.Int32

\n

The middle path tier

\n

\n

bot System.Int32

\n

The bottom path tier

\n

Returns

\n

Il2CppAssets.Scripts.Models.Towers.TowerModel
\nThe tower name/id

\n

\n

ModContent.GetTowerSet() Method

\n

Gets the fabricated TowerSet enum value for a ModTowerSet

\n
public static TowerSet GetTowerSet<T>()\n    where T : BTD_Mod_Helper.Api.Towers.ModTowerSet;\n
\n

Type parameters

\n

\n

T

\n

Returns

\n

Il2CppAssets.Scripts.Models.TowerSets.TowerSet

\n

\n

ModContent.HasMod(string, BloonsMod) Method

\n

Returns whether a mod with the given name is installed, and pass it to the out param if it is

\n
public static bool HasMod(string name, out BTD_Mod_Helper.BloonsMod bloonsMod);\n
\n

Parameters

\n

\n

name System.String

\n

\n

bloonsMod BloonsMod

\n

Returns

\n

System.Boolean

\n

\n

ModContent.HasMod(string) Method

\n

Returns whether a mod with the given name is installed

\n
public static bool HasMod(string name);\n
\n

Parameters

\n

\n

name System.String

\n

Returns

\n

System.Boolean

\n

\n

ModContent.Load(ModContent) Method

\n

Creates the Instances of a ModContent type within a Mod and adds them to ModContentInstances

\n
private static System.Collections.Generic.IEnumerable<BTD_Mod_Helper.Api.ModContent> Load(BTD_Mod_Helper.Api.ModContent instance);\n
\n

Parameters

\n

\n

instance ModContent

\n

Returns

\n

System.Collections.Generic.IEnumerable<ModContent>

\n

\n

ModContent.RoundSetId() Method

\n

Gets the ID for the given ModRoundSet

\n
public static string RoundSetId<T>()\n    where T : BTD_Mod_Helper.Api.Bloons.ModRoundSet;\n
\n

Type parameters

\n

\n

T

\n

Returns

\n

System.String

\n

\n

ModContent.TextureExists(BloonsMod, string) Method

\n

Gets whether a texture with a given name has been loaded by the Mod Helper for a mod

\n
public static bool TextureExists(BTD_Mod_Helper.BloonsMod bloonsMod, string name);\n
\n

Parameters

\n

\n

bloonsMod BloonsMod

\n

The mod to look in

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

System.Boolean

\n

\n

ModContent.TextureExists(string) Method

\n

Gets whether a texture with a given name has been loaded by the Mod Helper for this mod

\n
protected bool TextureExists(string name);\n
\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

System.Boolean

\n

\n

ModContent.TextureExists(string) Method

\n

Gets whether a texture with a given name has been loaded by the Mod Helper for a mod

\n
public static bool TextureExists<T>(string name)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

The mod to look in

\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

System.Boolean

\n

\n

ModContent.TowerID(int, int, int) Method

\n

Gets the internal tower name/id for a ModTower

\n
public static string TowerID<T>(int top=0, int mid=0, int bot=0)\n    where T : BTD_Mod_Helper.Api.Towers.ModTower;\n
\n

Type parameters

\n

\n

T

\n

The ModTower type

\n

Parameters

\n

\n

top System.Int32

\n

The top path tier

\n

\n

mid System.Int32

\n

The middle path tier

\n

\n

bot System.Int32

\n

The bottom path tier

\n

Returns

\n

System.String
\nThe tower name/id

\n

\n

ModContent.TryFind(string, T) Method

\n

Finds the loaded ModContent with the given Id and type T

\n
public static bool TryFind<T>(string id, out T result)\n    where T : BTD_Mod_Helper.Api.ModContent;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

id System.String

\n

\n

result (string, T).T\">T

\n

Returns

\n

System.Boolean

\n

\n

ModContent.UpgradeID() Method

\n

Gets the internal upgrade name/id for a ModUpgrade

\n
public static string UpgradeID<T>()\n    where T : BTD_Mod_Helper.Api.Towers.ModUpgrade;\n
\n

Type parameters

\n

\n

T

\n

The ModUpgrade type

\n

Returns

\n

System.String
\nThe upgrade name/id

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Api.ModContent"}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Api

\n

ModContent Class

\n

ModContent serves two major purposes:
\n

\n
    \n
  1. It is a base class for things that needs to be loaded via reflection from mods and given Ids,
    \nsuch as ModTower and ModUpgrade\n
    \n
  2. \n
  3. It is a utility class with methods to access instances of those classes and other resources
  4. \n
\n
public abstract class ModContent :\nBTD_Mod_Helper.Api.IModContent,\nSystem.IComparable<BTD_Mod_Helper.Api.ModContent>\n
\n

Inheritance System.Object  ModContent

\n

Derived
\n↳ ModSettings
\n↳ ModTextOverride
\n↳ ModDisplay
\n↳ ModByteLoader
\n↳ ModGameMenu
\n↳ NamedModContent
\n↳ ModVanillaContent

\n

Implements IModContent, System.IComparable<ModContent>

\n

Fields

\n

\n

ModContent.mod Field

\n

The BloonsTD6Mod that this content was added by

\n
public BloonsMod mod;\n
\n

Field Value

\n

BloonsMod

\n

Properties

\n

\n

ModContent.Id Property

\n

The id that this ModContent will be given; a combination of the Mod's prefix and the name

\n
public string Id { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModContent.Name Property

\n

The name that will be at the end of the ID for this ModContent, by default the class name

\n
public virtual string Name { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModContent.Order Property

\n

The order that this ModContent will be loaded/registered in by Mod Helper.
\nUseful for changing the ordering that it will appear in in-game relative to other content of this type in your mod,
\nor for making certain content load before others like may be necessary for sub-towers.
\nDefault/0 will use arbitrary ordering.

\n
protected virtual int Order { get; }\n
\n

Property Value

\n

System.Int32

\n

Methods

\n

\n

ModContent.BloonID() Method

\n

Gets the ID for the given ModBloon

\n
public static string BloonID<T>()\n    where T : BTD_Mod_Helper.Api.Bloons.ModBloon;\n
\n

Type parameters

\n

\n

T

\n

Returns

\n

System.String

\n

\n

ModContent.CreateAudioSourceReference(string) Method

\n

Returns a new AudioSourceReference that uses the given guid

\n
public static AudioSourceReference CreateAudioSourceReference(string guid);\n
\n

Parameters

\n

\n

guid System.String

\n

The guid that you'd like to assign to the AudioSourceReference

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.AudioSourceReference

\n

\n

ModContent.CreateAudioSourceReference(string) Method

\n

Gets an AudioSource reference for a given sound within a mod

\n
public static AudioSourceReference CreateAudioSourceReference<T>(string name)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

The mod

\n

Parameters

\n

\n

name System.String

\n

Sound name (no .wav)

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.AudioSourceReference
\nAn AudioSoundReference

\n

\n

ModContent.CreatePrefabReference(string) Method

\n

Returns a new PrefabReference that uses the given guid

\n
public static PrefabReference CreatePrefabReference(string guid);\n
\n

Parameters

\n

\n

guid System.String

\n

The guid that you'd like to assign to the PrefabReference

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.PrefabReference

\n

\n

ModContent.CreatePrefabReference() Method

\n

Creates a Prefab Reference for a ModDisplay

\n
public static PrefabReference CreatePrefabReference<T>()\n    where T : BTD_Mod_Helper.Api.Display.ModDisplay;\n
\n

Type parameters

\n

\n

T

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.PrefabReference

\n

\n

ModContent.CreateSpriteReference(string) Method

\n

Returns a new SpriteReference that uses the given guid

\n
public static SpriteReference CreateSpriteReference(string guid);\n
\n

Parameters

\n

\n

guid System.String

\n

The guid that you'd like to assign to the SpriteReference

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference

\n

\n

ModContent.Find(string) Method

\n

Finds the loaded ModContent with the given Id and type T

\n
public static T Find<T>(string id)\n    where T : BTD_Mod_Helper.Api.ModContent;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

id System.String

\n

Returns

\n

(string).T\">T

\n

\n

ModContent.GameModeId() Method

\n

Gets the ID for the given ModGameMode

\n
public static string GameModeId<T>()\n    where T : BTD_Mod_Helper.Api.Scenarios.ModGameMode;\n
\n

Type parameters

\n

\n

T

\n

Returns

\n

System.String

\n

\n

ModContent.GetAudioClip(BloonsMod, string) Method

\n

Gets an AudioClip from a mod by its name (no file extension included)

\n
public static AudioClip GetAudioClip(BTD_Mod_Helper.BloonsMod mod, string name);\n
\n

Parameters

\n

\n

mod BloonsMod

\n

The mod

\n

\n

name System.String

\n

Sound name (no .wav)

\n

Returns

\n

UnityEngine.AudioClip
\na playable AudioClip

\n

\n

ModContent.GetAudioClip(string) Method

\n

Gets an AudioClip from this mod by its name (no file extension included)

\n
public AudioClip GetAudioClip(string name);\n
\n

Parameters

\n

\n

name System.String

\n

Sound name (no .wav)

\n

Returns

\n

UnityEngine.AudioClip
\na playable AudioClip

\n

\n

ModContent.GetAudioClip(string) Method

\n

Gets an AudioClip from a mod by its name (no file extension included)

\n
public static AudioClip GetAudioClip<T>(string name)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

The mod

\n

Parameters

\n

\n

name System.String

\n

Sound name (no .wav)

\n

Returns

\n

UnityEngine.AudioClip
\na playable AudioClip

\n

\n

ModContent.GetAudioSourceReference(BloonsMod, string) Method

\n

Gets an AudioSource reference for a given sound within a mod

\n
public static AudioSourceReference GetAudioSourceReference(BTD_Mod_Helper.BloonsMod mod, string name);\n
\n

Parameters

\n

\n

mod BloonsMod

\n

\n

name System.String

\n

Sound name (no .wav)

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.AudioSourceReference
\nAn AudioSoundReference

\n

\n

ModContent.GetAudioSourceReference(string) Method

\n

Gets an AudioSource reference for a given sound within this mod

\n
public AudioSourceReference GetAudioSourceReference(string name);\n
\n

Parameters

\n

\n

name System.String

\n

Sound name (no .wav)

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.AudioSourceReference
\nAn AudioSoundReference

\n

\n

ModContent.GetAudioSourceReference(string) Method

\n

Gets an AudioSource reference for a given sound within a mod

\n
public static AudioSourceReference GetAudioSourceReference<T>(string name)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

The mod

\n

Parameters

\n

\n

name System.String

\n

Sound name (no .wav)

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.AudioSourceReference
\nAn AudioSoundReference

\n

\n

ModContent.GetBundle(BloonsMod, string) Method

\n

Gets a bundle from a mod with the specified name (no file extension)

\n
public static AssetBundle GetBundle(BTD_Mod_Helper.BloonsMod mod, string name);\n
\n

Parameters

\n

\n

mod BloonsMod

\n

\n

name System.String

\n

Returns

\n

UnityEngine.AssetBundle

\n

\n

ModContent.GetBundle(string) Method

\n

Gets a bundle from your mod with the specified name (no file extension)

\n
protected AssetBundle GetBundle(string name);\n
\n

Parameters

\n

\n

name System.String

\n

Returns

\n

UnityEngine.AssetBundle

\n

\n

ModContent.GetBundle(string) Method

\n

Gets a bundle from the mod T with the specified name (no file extension)

\n
public static AssetBundle GetBundle<T>(string name)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

name System.String

\n

Returns

\n

UnityEngine.AssetBundle

\n

\n

ModContent.GetContent() Method

\n

Gets all loaded ModContent objects that are T or a subclass of T

\n
public static System.Collections.Generic.List<T> GetContent<T>()\n    where T : BTD_Mod_Helper.Api.ModContent;\n
\n

Type parameters

\n

\n

T

\n

Returns

\n

System.Collections.Generic.List<().T\">T>

\n

\n

ModContent.GetDisplayGUID() Method

\n

Gets the GUID (thing that should be used in the display field for things) for a specific ModDisplay

\n
public static string GetDisplayGUID<T>()\n    where T : BTD_Mod_Helper.Api.Display.ModDisplay;\n
\n

Type parameters

\n

\n

T

\n

Returns

\n

System.String

\n

\n

ModContent.GetId(BloonsMod, string) Method

\n

Gets the id of a resource by appending the mod's ID prefix to its name

\n
public static string GetId(BTD_Mod_Helper.BloonsMod bloonsMod, string name);\n
\n

Parameters

\n

\n

bloonsMod BloonsMod

\n

\n

name System.String

\n

Returns

\n

System.String

\n

\n

ModContent.GetId(string) Method

\n

Gets the id of a resource by appending the mod's ID prefix to its name

\n
public string GetId(string name);\n
\n

Parameters

\n

\n

name System.String

\n

Returns

\n

System.String

\n

\n

ModContent.GetId(string) Method

\n

Gets the id of a resource by appending the mod's ID prefix to its name

\n
public static string GetId<T>(string name)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

name System.String

\n

Returns

\n

System.String

\n

\n

ModContent.GetInstance(Type) Method

\n

Gets the official instance of a particular ModContent or BloonsTD6Mod based on its type

\n
public static BTD_Mod_Helper.Api.IModContent GetInstance(System.Type type);\n
\n

Parameters

\n

\n

type System.Type

\n

The type to get the instance of

\n

Returns

\n

IModContent
\nThe official instance of it

\n

\n

ModContent.GetInstance() Method

\n

Gets the singleton instance of a particular ModContent or BloonsTD6Mod based on its type

\n
public static T GetInstance<T>()\n    where T : BTD_Mod_Helper.Api.IModContent;\n
\n

Type parameters

\n

\n

T

\n

The type to get the instance of

\n

Returns

\n

().T\">T
\nThe singleton instance of it

\n

\n

ModContent.GetInstances() Method

\n

Gets all loaded ModContent objects that are exactly of type T

\n
public static System.Collections.Generic.List<T> GetInstances<T>()\n    where T : BTD_Mod_Helper.Api.ModContent;\n
\n

Type parameters

\n

\n

T

\n

Returns

\n

System.Collections.Generic.List<().T\">T>

\n

\n

ModContent.GetMod(string) Method

\n

Gets a BloonsTD6Mod by its name, or returns null if none are loaded with that name

\n
public static BTD_Mod_Helper.BloonsMod GetMod(string name);\n
\n

Parameters

\n

\n

name System.String

\n

Returns

\n

BloonsMod

\n

\n

ModContent.GetSprite(BloonsMod, string, float) Method

\n

Constructs a Sprite for a given texture name within a given mod

\n
public static Sprite GetSprite(BTD_Mod_Helper.BloonsMod mod, string name, float pixelsPerUnit=10f);\n
\n

Parameters

\n

\n

mod BloonsMod

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

\n

pixelsPerUnit System.Single

\n

The pixels per unit for the Sprite to have

\n

Returns

\n

UnityEngine.Sprite
\nA Sprite

\n

\n

ModContent.GetSprite(string, float) Method

\n

Constructs a Sprite for a given texture name within this mod

\n
protected Sprite GetSprite(string name, float pixelsPerUnit=10f);\n
\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

\n

pixelsPerUnit System.Single

\n

The pixels per unit for the Sprite to have

\n

Returns

\n

UnityEngine.Sprite
\nA Sprite

\n

\n

ModContent.GetSprite(string, float) Method

\n

Constructs a Sprite for a given texture name within a given mod

\n
public static Sprite GetSprite<T>(string name, float pixelsPerUnit=10f)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

\n

pixelsPerUnit System.Single

\n

The pixels per unit for the Sprite to have

\n

Returns

\n

UnityEngine.Sprite
\nA Sprite

\n

\n

ModContent.GetSpriteReference(BloonsMod, string) Method

\n

Gets a sprite reference by name for a specific mod

\n
public static SpriteReference GetSpriteReference(BTD_Mod_Helper.BloonsMod mod, string name);\n
\n

Parameters

\n

\n

mod BloonsMod

\n

The BloonsTD6Mod that the texture is from

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference
\nA new SpriteReference

\n

\n

ModContent.GetSpriteReference(string) Method

\n

Gets a sprite reference by name for this mod

\n
protected SpriteReference GetSpriteReference(string name);\n
\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference
\nA new SpriteReference

\n

\n

ModContent.GetSpriteReference(string) Method

\n

Gets a sprite reference by name for a specific mod

\n
public static SpriteReference GetSpriteReference<T>(string name)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

Your mod's main BloonsTD6Mod extending class

\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference
\nA new SpriteReference

\n

\n

ModContent.GetSpriteReferenceOrDefault(BloonsMod, string) Method

\n

Gets a sprite reference by name for a specific mod, or if the mod does not include a texture with that name,
\ntreats it as a vanilla sprite reference

\n
public static SpriteReference GetSpriteReferenceOrDefault(BTD_Mod_Helper.BloonsMod mod, string name);\n
\n

Parameters

\n

\n

mod BloonsMod

\n

The BloonsTD6Mod that the texture is from

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference
\nA new SpriteReference

\n

\n

ModContent.GetSpriteReferenceOrDefault(string) Method

\n

Gets a sprite reference by name for a specific mod, or if the mod does not include a texture with that name,
\ntreats it as a vanilla sprite reference

\n
protected SpriteReference GetSpriteReferenceOrDefault(string name);\n
\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference
\nA new SpriteReference

\n

\n

ModContent.GetSpriteReferenceOrDefault(string) Method

\n

Gets a sprite reference by name for a specific mod, or if the mod does not include a texture with that name,
\ntreats it as a vanilla sprite reference

\n
public static SpriteReference GetSpriteReferenceOrDefault<T>(string name)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

Your mod's main BloonsTD6Mod extending class

\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference
\nA new SpriteReference

\n

\n

ModContent.GetSpriteReferenceOrNull(BloonsMod, string) Method

\n

Gets a sprite reference by name for a specific mod, returning null if the texture hasn't currently been
\nloaded instead of an invalid SpriteReference

\n
public static SpriteReference GetSpriteReferenceOrNull(BTD_Mod_Helper.BloonsMod mod, string name);\n
\n

Parameters

\n

\n

mod BloonsMod

\n

The BloonsTD6Mod that the texture is from

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference
\nA new SpriteReference

\n

\n

ModContent.GetSpriteReferenceOrNull(string) Method

\n

Gets a sprite reference by name for this mod, returning null if the texture hasn't currently been
\nloaded instead of an invalid SpriteReference

\n
protected SpriteReference GetSpriteReferenceOrNull(string name);\n
\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference
\nA new SpriteReference

\n

\n

ModContent.GetSpriteReferenceOrNull(string) Method

\n

Gets a sprite reference by name for a specific mod, returning null if the texture hasn't currently been
\nloaded instead of an invalid SpriteReference

\n
public static SpriteReference GetSpriteReferenceOrNull<T>(string name)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

Your mod's main BloonsTD6Mod extending class

\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference
\nA new SpriteReference

\n

\n

ModContent.GetTexture(BloonsMod, string) Method

\n

Constructs a Texture2D for a given texture name within a mod

\n
public static Texture2D GetTexture(BTD_Mod_Helper.BloonsMod bloonsMod, string fileName);\n
\n

Parameters

\n

\n

bloonsMod BloonsMod

\n

The mod that adds this texture

\n

\n

fileName System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

UnityEngine.Texture2D
\nA Texture2D

\n

\n

ModContent.GetTexture(string) Method

\n

Constructs a Texture2D for a given texture name within this mod

\n
protected Texture2D GetTexture(string fileName);\n
\n

Parameters

\n

\n

fileName System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

UnityEngine.Texture2D
\nA Texture2D

\n

\n

ModContent.GetTexture(string) Method

\n

Constructs a Texture2D for a given texture name within a mod

\n
public static Texture2D GetTexture<T>(string fileName)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

fileName System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

UnityEngine.Texture2D
\nA Texture2D

\n

\n

ModContent.GetTextureBytes(BloonsMod, string) Method

\n

Returns the Bytes associated with a texture.

\n
public static byte[] GetTextureBytes(BTD_Mod_Helper.BloonsMod bloonsMod, string fileName);\n
\n

Parameters

\n

\n

bloonsMod BloonsMod

\n

The mod that adds this texture.

\n

\n

fileName System.String

\n

The file name of your texture, without the extension.

\n

Returns

\n

System.Byte[]
\nThe bytes associated with the texture.

\n

\n

ModContent.GetTextureBytes(string) Method

\n

Returns the Bytes associated with a texture.

\n
protected byte[] GetTextureBytes(string fileName);\n
\n

Parameters

\n

\n

fileName System.String

\n

The file name of your texture, without the extension.

\n

Returns

\n

System.Byte[]
\nThe bytes associated with the texture.

\n

\n

ModContent.GetTextureBytes(string) Method

\n

Returns the Bytes associated with a texture.

\n
public static byte[] GetTextureBytes<T>(string fileName)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

fileName System.String

\n

The file name of your texture, without the extension.

\n

Returns

\n

System.Byte[]
\nThe bytes associated with the texture.

\n

\n

ModContent.GetTextureGUID(BloonsMod, string) Method

\n

Gets a texture's GUID by name for a specific mod

\n
public static string GetTextureGUID(BTD_Mod_Helper.BloonsMod mod, string fileName);\n
\n

Parameters

\n

\n

mod BloonsMod

\n

The BloonsTD6Mod that the texture is from

\n

\n

fileName System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

System.String
\nThe texture's GUID

\n

\n

ModContent.GetTextureGUID(string) Method

\n

Gets a texture's GUID by name for this mod
\n

\nReturns null if a Texture hasn't been loaded with that name

\n
public string GetTextureGUID(string name);\n
\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

System.String
\nThe texture's GUID

\n

\n

ModContent.GetTextureGUID(string) Method

\n

Gets a texture's GUID by name for a specific mod, to be used in SpriteReferences
\n

\nReturns null if a Texture hasn't been loaded with that name

\n
public static string GetTextureGUID<T>(string name)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

Your mod's main BloonsTD6Mod extending class

\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

System.String
\nThe texture's GUID

\n

\n

ModContent.GetTowerModel(int, int, int) Method

\n

Gets the TowerModel for a ModTower at a specific tier level

\n
public static TowerModel GetTowerModel<T>(int top=0, int mid=0, int bot=0)\n    where T : BTD_Mod_Helper.Api.Towers.ModTower;\n
\n

Type parameters

\n

\n

T

\n

The ModTower type

\n

Parameters

\n

\n

top System.Int32

\n

The top path tier

\n

\n

mid System.Int32

\n

The middle path tier

\n

\n

bot System.Int32

\n

The bottom path tier

\n

Returns

\n

Il2CppAssets.Scripts.Models.Towers.TowerModel
\nThe tower name/id

\n

\n

ModContent.GetTowerSet() Method

\n

Gets the fabricated TowerSet enum value for a ModTowerSet

\n
public static TowerSet GetTowerSet<T>()\n    where T : BTD_Mod_Helper.Api.Towers.ModTowerSet;\n
\n

Type parameters

\n

\n

T

\n

Returns

\n

Il2CppAssets.Scripts.Models.TowerSets.TowerSet

\n

\n

ModContent.HasMod(string, BloonsMod) Method

\n

Returns whether a mod with the given name is installed, and pass it to the out param if it is

\n
public static bool HasMod(string name, out BTD_Mod_Helper.BloonsMod bloonsMod);\n
\n

Parameters

\n

\n

name System.String

\n

\n

bloonsMod BloonsMod

\n

Returns

\n

System.Boolean

\n

\n

ModContent.HasMod(string) Method

\n

Returns whether a mod with the given name is installed

\n
public static bool HasMod(string name);\n
\n

Parameters

\n

\n

name System.String

\n

Returns

\n

System.Boolean

\n

\n

ModContent.Load(ModContent) Method

\n

Creates the Instances of a ModContent type within a Mod and adds them to ModContentInstances

\n
private static System.Collections.Generic.IEnumerable<BTD_Mod_Helper.Api.ModContent> Load(BTD_Mod_Helper.Api.ModContent instance);\n
\n

Parameters

\n

\n

instance ModContent

\n

Returns

\n

System.Collections.Generic.IEnumerable<ModContent>

\n

\n

ModContent.Localize(BloonsMod, string, string) Method

\n

Registers some text to the LocalizationManager using the given key (combined with your mod id) for use with
\nthe built in language system. NK texts components will Il2Cpp.NK_TextMeshProUGUI.AutoLocalize your keys.

\n
public static string Localize(BTD_Mod_Helper.BloonsMod mod, string key, string text);\n
\n

Parameters

\n

\n

mod BloonsMod

\n

The mod

\n

\n

key System.String

\n

The localization key

\n

\n

text System.String

\n

The default English text

\n

Returns

\n

System.String
\nThe Localization key

\n

\n

ModContent.Localize(BloonsMod, string) Method

\n

Registers some text to the LocalizationManager using the given key (combined with your mod id) for use with
\nthe built in language system. NK texts components will Il2Cpp.NK_TextMeshProUGUI.AutoLocalize your keys.

\n
public static string Localize(BTD_Mod_Helper.BloonsMod mod, string keyAndText);\n
\n

Parameters

\n

\n

mod BloonsMod

\n

The mod

\n

\n

keyAndText System.String

\n

Returns

\n

System.String
\nThe Localization key

\n

\n

ModContent.Localize(string, string) Method

\n

Registers some text to the LocalizationManager using the given key (combined with your mod id) for use with
\nthe built in language system. NK texts components will Il2Cpp.NK_TextMeshProUGUI.AutoLocalize your keys.

\n
public string Localize(string key, string text);\n
\n

Parameters

\n

\n

key System.String

\n

The localization key

\n

\n

text System.String

\n

The default English text

\n

Returns

\n

System.String
\nThe Localization key

\n

\n

ModContent.Localize(string) Method

\n

Registers some text to the LocalizationManager using the given key (combined with your mod id) for use with
\nthe built in language system. NK texts components will Il2Cpp.NK_TextMeshProUGUI.AutoLocalize your keys.

\n
public string Localize(string keyAndText);\n
\n

Parameters

\n

\n

keyAndText System.String

\n

Returns

\n

System.String
\nThe Localization key

\n

\n

ModContent.Localize(string, string) Method

\n

Registers some text to the LocalizationManager using the given key (combined with your mod id) for use with
\nthe built in language system. NK texts components will Il2Cpp.NK_TextMeshProUGUI.AutoLocalize your keys.

\n
public static string Localize<T>(string key, string text)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

key System.String

\n

The localization key

\n

\n

text System.String

\n

The default English text

\n

Returns

\n

System.String
\nThe Localization key

\n

\n

ModContent.Localize(string) Method

\n

Registers some text to the LocalizationManager using the given key (combined with your mod id) for use with
\nthe built in language system. NK texts components will Il2Cpp.NK_TextMeshProUGUI.AutoLocalize your keys.

\n
public static string Localize<T>(string keyAndText)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

keyAndText System.String

\n

Returns

\n

System.String
\nThe Localization key

\n

\n

ModContent.RoundSetId() Method

\n

Gets the ID for the given ModRoundSet

\n
public static string RoundSetId<T>()\n    where T : BTD_Mod_Helper.Api.Bloons.ModRoundSet;\n
\n

Type parameters

\n

\n

T

\n

Returns

\n

System.String

\n

\n

ModContent.TextureExists(BloonsMod, string) Method

\n

Gets whether a texture with a given name has been loaded by the Mod Helper for a mod

\n
public static bool TextureExists(BTD_Mod_Helper.BloonsMod bloonsMod, string name);\n
\n

Parameters

\n

\n

bloonsMod BloonsMod

\n

The mod to look in

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

System.Boolean

\n

\n

ModContent.TextureExists(string) Method

\n

Gets whether a texture with a given name has been loaded by the Mod Helper for this mod

\n
protected bool TextureExists(string name);\n
\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

System.Boolean

\n

\n

ModContent.TextureExists(string) Method

\n

Gets whether a texture with a given name has been loaded by the Mod Helper for a mod

\n
public static bool TextureExists<T>(string name)\n    where T : BTD_Mod_Helper.BloonsMod;\n
\n

Type parameters

\n

\n

T

\n

The mod to look in

\n

Parameters

\n

\n

name System.String

\n

The file name of your texture, without the extension

\n

Returns

\n

System.Boolean

\n

\n

ModContent.TowerID(int, int, int) Method

\n

Gets the internal tower name/id for a ModTower

\n
public static string TowerID<T>(int top=0, int mid=0, int bot=0)\n    where T : BTD_Mod_Helper.Api.Towers.ModTower;\n
\n

Type parameters

\n

\n

T

\n

The ModTower type

\n

Parameters

\n

\n

top System.Int32

\n

The top path tier

\n

\n

mid System.Int32

\n

The middle path tier

\n

\n

bot System.Int32

\n

The bottom path tier

\n

Returns

\n

System.String
\nThe tower name/id

\n

\n

ModContent.TryFind(string, T) Method

\n

Finds the loaded ModContent with the given Id and type T

\n
public static bool TryFind<T>(string id, out T result)\n    where T : BTD_Mod_Helper.Api.ModContent;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

id System.String

\n

\n

result (string, T).T\">T

\n

Returns

\n

System.Boolean

\n

\n

ModContent.UpgradeID() Method

\n

Gets the internal upgrade name/id for a ModUpgrade

\n
public static string UpgradeID<T>()\n    where T : BTD_Mod_Helper.Api.Towers.ModUpgrade;\n
\n

Type parameters

\n

\n

T

\n

The ModUpgrade type

\n

Returns

\n

System.String
\nThe upgrade name/id

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Api.ModContent"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModGameMenu.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModGameMenu.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModGameMenu.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModGameMenu.json diff --git a/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModGameMenu_T_.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModGameMenu_T_.json new file mode 100644 index 000000000..37f571a7e --- /dev/null +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModGameMenu_T_.json @@ -0,0 +1 @@ +{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Api

\n

ModGameMenu Class

\n

Generic class for creating a ModGameMenu with the given type as it's base menu

\n
public abstract class ModGameMenu<T> : BTD_Mod_Helper.Api.ModGameMenu\n    where T : GameMenu\n
\n

Type parameters

\n

\n

T

\n

Inheritance System.ObjectModContentModGameMenu  ModGameMenu

\n

Derived
\n↳ ModSettingsMenu

\n

Properties

\n

\n

ModGameMenu.BaseMenu Property

\n

The string name of the in game menu to copy from

\n
public override string BaseMenu { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModGameMenu.GameMenu Property

\n

The current GameMenu

\n
public T GameMenu { get; }\n
\n

Property Value

\n

.T\">T

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Api.ModGameMenu_T_"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModLoadTask.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModLoadTask.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModLoadTask.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModLoadTask.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModMenu.ModHelperHttp.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModMenu.ModHelperHttp.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModMenu.ModHelperHttp.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModMenu.ModHelperHttp.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModMenuData.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModMenuData.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModMenuData.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModMenuData.json diff --git a/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSetting.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSetting.json new file mode 100644 index 000000000..5f502f9a4 --- /dev/null +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSetting.json @@ -0,0 +1 @@ +{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Api.ModOptions

\n

ModSetting Class

\n

Base class for a ModSetting without the generics

\n
public abstract class ModSetting\n
\n

Inheritance System.Object  ModSetting

\n

Derived
\n↳ \">ModSetting<T>
\n↳ ModSettingButton

\n

Fields

\n

\n

ModSetting.category Field

\n

The category that this is part of, or null

\n
public ModSettingCategory category;\n
\n

Field Value

\n

ModSettingCategory

\n

\n

ModSetting.description Field

\n

The description / explanation of this mod setting

\n
public string description;\n
\n

Field Value

\n

System.String

\n

\n

ModSetting.displayName Field

\n

The exact name displayed for this mod setting. If unset, will use the variable name.

\n
public string displayName;\n
\n

Field Value

\n

System.String

\n

\n

ModSetting.icon Field

\n

Icon to display alongside the setting

\n
public string icon;\n
\n

Field Value

\n

System.String

\n

\n

ModSetting.modifyOption Field

\n

Action to modify the ModHelperOption after it's created

\n
public Action<ModHelperOption> modifyOption;\n
\n

Field Value

\n

System.Action<ModHelperOption>

\n

\n

ModSetting.requiresRestart Field

\n

Indicates to players that the effects of changing this setting will only take place after a restart

\n
public bool requiresRestart;\n
\n

Field Value

\n

System.Boolean

\n

\n

ModSetting.source Field

\n

The type where this ModSettings was defined

\n
public IModSettings source;\n
\n

Field Value

\n

IModSettings

\n

Properties

\n

\n

ModSetting.Name Property

\n

The name of this mod setting, gotten from the field name

\n
public string Name { get; set; }\n
\n

Property Value

\n

System.String

\n

Methods

\n

\n

ModSetting.CreateBaseOption() Method

\n

Creates a base ModHelperOption component based on the name, description and icon of this

\n
protected BTD_Mod_Helper.Api.Components.ModHelperOption CreateBaseOption();\n
\n

Returns

\n

ModHelperOption

\n

\n

ModSetting.GetDefaultValue() Method

\n

Gets the default value for this ModSetting

\n
public virtual object GetDefaultValue();\n
\n

Returns

\n

System.Object
\nThe default value

\n

\n

ModSetting.GetLastSavedValue() Method

\n

Gets the last saved value for this ModSetting

\n
public virtual object GetLastSavedValue();\n
\n

Returns

\n

System.Object
\nThe last saved value

\n

\n

ModSetting.GetValue() Method

\n

Gets the current value that this ModSetting holds

\n
public virtual object GetValue();\n
\n

Returns

\n

System.Object
\nThe value

\n

\n

ModSetting.SetValue(object) Method

\n

Sets the current value of this ModSetting

\n
public virtual void SetValue(object val);\n
\n

Parameters

\n

\n

val System.Object

\n

The new value

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Api.ModOptions.ModSetting"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingBool.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingBool.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingBool.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingBool.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingButton.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingButton.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingButton.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingButton.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingCategory.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingCategory.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingCategory.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingCategory.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingDouble.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingDouble.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingDouble.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingDouble.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingEnum_T_.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingEnum_T_.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingEnum_T_.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingEnum_T_.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingFile.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingFile.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingFile.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingFile.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingFloat.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingFloat.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingFloat.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingFloat.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingFolder.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingFolder.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingFolder.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingFolder.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingHotkey.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingHotkey.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingHotkey.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingHotkey.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingInt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingInt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingInt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingInt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingNumber_T_.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingNumber_T_.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingNumber_T_.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingNumber_T_.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingString.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingString.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingString.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSettingString.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSetting_T_.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSetting_T_.json similarity index 61% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSetting_T_.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSetting_T_.json index 49efb1a93..77d91ada0 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSetting_T_.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.ModOptions.ModSetting_T_.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Api.ModOptions

\n

ModSetting Class

\n

Class for keeping track of a variable for a Mod that can be changed in game via the Mod Settings menu

\n
public abstract class ModSetting<T> : BTD_Mod_Helper.Api.ModOptions.ModSetting\n
\n

Type parameters

\n

\n

T

\n

The type that this ModSetting holds

\n

Inheritance System.ObjectModSetting  ModSetting

\n

Derived
\n↳ ModSettingBool
\n↳ \">ModSettingEnum<T>
\n↳ ModSettingFile
\n↳ ModSettingFolder
\n↳ ModSettingHotkey
\n↳ \">ModSettingNumber<T>
\n↳ ModSettingString

\n

Constructors

\n

\n

ModSetting(T) Constructor

\n

Constructs a new ModSetting for the given value

\n
protected ModSetting(T value);\n
\n

Parameters

\n

\n

value .T\">T

\n

Fields

\n

\n

ModSetting.customValidation Field

\n

Will only save the result and run onSave if this custom function validates the value

\n
public Func<T,bool> customValidation;\n
\n

Field Value

\n

System.Func<.T\">T,System.Boolean>

\n

\n

ModSetting.onSave Field

\n

Action to call when the value is saved, i.e. once they actually close the menu

\n
public Action<T> onSave;\n
\n

Field Value

\n

System.Action<.T\">T>

\n

\n

ModSetting.onValueChanged Field

\n

Action to call when the value changes within the menu

\n
public Action<T> onValueChanged;\n
\n

Field Value

\n

System.Action<.T\">T>

\n

Properties

\n

\n

ModSetting.OnValueChanged Property

\n

Old onValueChanged.

\n
public System.Collections.Generic.List<System.Action<T>> OnValueChanged { get; set; }\n
\n

Property Value

\n

System.Collections.Generic.List<System.Action<.T\">T>>

\n

Methods

\n

\n

ModSetting.GetDefaultValue() Method

\n

Gets the default value for this ModSetting

\n
public override object GetDefaultValue();\n
\n

Returns

\n

System.Object
\nThe default value

\n

\n

ModSetting.GetValue() Method

\n

Gets the current value that this ModSetting holds

\n
public override object GetValue();\n
\n

Returns

\n

System.Object
\nThe value

\n

\n

ModSetting.SetValue(object) Method

\n

Sets the current value of this ModSetting

\n
public override void SetValue(object val);\n
\n

Parameters

\n

\n

val System.Object

\n

The new value

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Api.ModOptions.ModSetting_T_"}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Api.ModOptions

\n

ModSetting Class

\n

Class for keeping track of a variable for a Mod that can be changed in game via the Mod Settings menu

\n
public abstract class ModSetting<T> : BTD_Mod_Helper.Api.ModOptions.ModSetting\n
\n

Type parameters

\n

\n

T

\n

The type that this ModSetting holds

\n

Inheritance System.ObjectModSetting  ModSetting

\n

Derived
\n↳ ModSettingBool
\n↳ \">ModSettingEnum<T>
\n↳ ModSettingFile
\n↳ ModSettingFolder
\n↳ ModSettingHotkey
\n↳ \">ModSettingNumber<T>
\n↳ ModSettingString

\n

Constructors

\n

\n

ModSetting(T) Constructor

\n

Constructs a new ModSetting for the given value

\n
protected ModSetting(T value);\n
\n

Parameters

\n

\n

value .T\">T

\n

Fields

\n

\n

ModSetting.customValidation Field

\n

Will only save the result and run onSave if this custom function validates the value

\n
public Func<T,bool> customValidation;\n
\n

Field Value

\n

System.Func<.T\">T,System.Boolean>

\n

\n

ModSetting.onSave Field

\n

Action to call when the value is saved, i.e. once they actually close the menu

\n
public Action<T> onSave;\n
\n

Field Value

\n

System.Action<.T\">T>

\n

\n

ModSetting.onValueChanged Field

\n

Action to call when the value changes within the menu

\n
public Action<T> onValueChanged;\n
\n

Field Value

\n

System.Action<.T\">T>

\n

Properties

\n

\n

ModSetting.OnValueChanged Property

\n

Old onValueChanged.

\n
public System.Collections.Generic.List<System.Action<T>> OnValueChanged { get; set; }\n
\n

Property Value

\n

System.Collections.Generic.List<System.Action<.T\">T>>

\n

Methods

\n

\n

ModSetting.GetDefaultValue() Method

\n

Gets the default value for this ModSetting

\n
public override object GetDefaultValue();\n
\n

Returns

\n

System.Object
\nThe default value

\n

\n

ModSetting.GetLastSavedValue() Method

\n

Gets the last saved value for this ModSetting

\n
public override object GetLastSavedValue();\n
\n

Returns

\n

System.Object
\nThe last saved value

\n

\n

ModSetting.GetValue() Method

\n

Gets the current value that this ModSetting holds

\n
public override object GetValue();\n
\n

Returns

\n

System.Object
\nThe value

\n

\n

ModSetting.SetValue(object) Method

\n

Sets the current value of this ModSetting

\n
public override void SetValue(object val);\n
\n

Parameters

\n

\n

val System.Object

\n

The new value

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Api.ModOptions.ModSetting_T_"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.MoreAccessTools.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.MoreAccessTools.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.MoreAccessTools.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.MoreAccessTools.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.NamedModContent.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.NamedModContent.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.NamedModContent.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.NamedModContent.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Scenarios.ModGameMode.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Scenarios.ModGameMode.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Scenarios.ModGameMode.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Scenarios.ModGameMode.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.TaskScheduler.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.TaskScheduler.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.TaskScheduler.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.TaskScheduler.json diff --git a/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModHero.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModHero.json new file mode 100644 index 000000000..6c7814a53 --- /dev/null +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModHero.json @@ -0,0 +1 @@ +{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Api.Towers

\n

ModHero Class

\n

Class for adding a custom Hero to the game. Use alongside ModHeroLevel to give multiple levels.

\n
public abstract class ModHero : BTD_Mod_Helper.Api.Towers.ModTower\n
\n

Inheritance System.ObjectModContentNamedModContentModTower  ModHero

\n

Properties

\n

\n

ModHero.Abilities Property

\n

The total number of abilities that this hero has as max level
\n

\nOBSOLETE: No longer required to manually specify

\n
public virtual int Abilities { get; }\n
\n

Property Value

\n

System.Int32

\n

\n

ModHero.BackgroundStyle Property

\n

The other hero that has the same background color in the Heroes menu as you want to use

\n
public virtual string BackgroundStyle { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModHero.BaseTower Property

\n

The default hero (or tower) to base your hero off of

\n
public override string BaseTower { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModHero.BottomPathUpgrades Property

\n

No other upgrade paths used

\n
public sealed override int BottomPathUpgrades { get; }\n
\n

Property Value

\n

System.Int32

\n

\n

ModHero.Button Property

\n

The png name of the Button icon for this hero in the UI, by default Name-Button

\n
public virtual string Button { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModHero.ButtonReference Property

\n

The exact sprite reference used for the button

\n
public virtual SpriteReference ButtonReference { get; }\n
\n

Property Value

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference

\n

\n

ModHero.DontAddToShop Property

\n

Heroes aren't in the default shop

\n
public sealed override bool DontAddToShop { get; }\n
\n

Property Value

\n

System.Boolean

\n

\n

ModHero.GlowStyle Property

\n

The other hero that has the same glow color in the Heroes menu as you want to use

\n
public virtual string GlowStyle { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModHero.IncludeInMonkeyTeams Property

\n

Not a thing anyway

\n
public sealed override bool IncludeInMonkeyTeams { get; }\n
\n

Property Value

\n

System.Boolean

\n

\n

ModHero.Level1Description Property

\n

The description to use for the first level of your hero

\n
public abstract string Level1Description { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModHero.MaxLevel Property

\n

The total number of levels this hero has. Do not set this to anything other than number of ModHeroLevels
\nthat you've actually created for your Hero.

\n
public virtual int MaxLevel { get; }\n
\n

Property Value

\n

System.Int32

\n

\n

ModHero.MiddlePathUpgrades Property

\n

No other upgrade paths used

\n
public sealed override int MiddlePathUpgrades { get; }\n
\n

Property Value

\n

System.Int32

\n

\n

ModHero.NameStyle Property

\n

The other hero that has the same colored name in the Heroes menu as you want to use

\n
public virtual string NameStyle { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModHero.ParagonMode Property

\n

No paragon heroes

\n
public sealed override BTD_Mod_Helper.Api.Towers.ParagonMode ParagonMode { get; }\n
\n

Property Value

\n

ParagonMode

\n

\n

ModHero.SelectScreenPortraits Property

\n

If you want to manually override which portraits your hero uses in the select screen, mess with this
\n

\nBy default will find any PortraitReferences defined in your ModHeroLevels
\n

\nThe SpriteReference is the actual image that will be displayed

\n
public virtual System.Collections.Generic.Dictionary<int,SpriteReference> SelectScreenPortraits { get; }\n
\n

Property Value

\n

System.Collections.Generic.Dictionary<System.Int32,Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference>

\n

\n

ModHero.SelectSound Property

\n

Sound to play when you select this hero in the hero select screen, the sound must be registered in the game for it to
\nplay

\n
public virtual string SelectSound { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModHero.Square Property

\n

The name of the png to try to find for the new hero select screen button

\n
public virtual string Square { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModHero.SquareReference Property

\n

The SpriteReference for this hero's Square icon in the new revamped HeroScreen

\n
public virtual SpriteReference SquareReference { get; }\n
\n

Property Value

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference

\n

\n

ModHero.Title Property

\n

The short description that appears under the name of the hero

\n
public abstract string Title { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModHero.TopPathUpgrades Property

\n

Putting all the hero level upgrades in the top path

\n
public sealed override int TopPathUpgrades { get; }\n
\n

Property Value

\n

System.Int32

\n

\n

ModHero.TowerSet Property

\n

Heroes can only be in the Hero tower set

\n
public sealed override TowerSet TowerSet { get; }\n
\n

Property Value

\n

Il2CppAssets.Scripts.Models.TowerSets.TowerSet

\n

\n

ModHero.XpRatio Property

\n

XpRatio to use when determining the default xp costs of the levels.
\n

\nAll four base heroes (Quincy, Gwendolin, Striker Jones, Obyn Greenfoot) as well as Etienne have an XP ratio of 1x.
\n

\nEzili, Pat Fusty, Admiral Brickell, and Sauda have a 1.425x XP ratio.
\n

\nBenjamin and Psi have an XP ratio of 1.5x.
\n

\nCaptain Churchill and Adora have a ratio of 1.71x.

\n
public abstract float XpRatio { get; }\n
\n

Property Value

\n

System.Single

\n

Methods

\n

\n

ModHero.CreateDefaultSkin(Dictionary<string,SkinData>) Method

\n

Creates the SkinData for the default tower

\n
public virtual SkinData CreateDefaultSkin(System.Collections.Generic.Dictionary<string,SkinData> skinsByName);\n
\n

Parameters

\n

\n

skinsByName System.Collections.Generic.Dictionary<System.String,Il2CppAssets.Scripts.Data.Skins.SkinData>

\n

Existing hero skins by their skin/tower name

\n

Returns

\n

Il2CppAssets.Scripts.Data.Skins.SkinData

\n

\n

ModHero.GetBackgroundBanner(Dictionary<string,SkinData>) Method

\n

Gets the Background Banner for the default SkinData

\n
public virtual PrefabReference GetBackgroundBanner(System.Collections.Generic.Dictionary<string,SkinData> skinsByName);\n
\n

Parameters

\n

\n

skinsByName System.Collections.Generic.Dictionary<System.String,Il2CppAssets.Scripts.Data.Skins.SkinData>

\n

Existing hero skins by their skin/tower name

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.PrefabReference

\n

\n

ModHero.GetBackgroundColor(Dictionary<string,SkinData>) Method

\n

Gets the background color for the default SkinData

\n
public virtual Color GetBackgroundColor(System.Collections.Generic.Dictionary<string,SkinData> skinsByName);\n
\n

Parameters

\n

\n

skinsByName System.Collections.Generic.Dictionary<System.String,Il2CppAssets.Scripts.Data.Skins.SkinData>

\n

Existing hero skins by their skin/tower name

\n

Returns

\n

UnityEngine.Color

\n

\n

ModHero.GetFontMaterial(Dictionary<string,SkinData>) Method

\n

Gets the font material for the default SkinData

\n
public virtual string GetFontMaterial(System.Collections.Generic.Dictionary<string,SkinData> skinsByName);\n
\n

Parameters

\n

\n

skinsByName System.Collections.Generic.Dictionary<System.String,Il2CppAssets.Scripts.Data.Skins.SkinData>

\n

Existing hero skins by their skin/tower name

\n

Returns

\n

System.String

\n

\n

ModHero.GetHeroIndex(List) Method

\n

The index to add this hero at in relation to other heroes

\n
public virtual int GetHeroIndex(System.Collections.Generic.List<HeroDetailsModel> heroSet);\n
\n

Parameters

\n

\n

heroSet System.Collections.Generic.List<Il2CppAssets.Scripts.Models.TowerSets.HeroDetailsModel>

\n

Returns

\n

System.Int32

\n

\n

ModHero.TowerTiers() Method

\n

Heroes tower tiers are always Level-0-0

\n
public sealed override System.Collections.Generic.IEnumerable<int[]> TowerTiers();\n
\n

Returns

\n

System.Collections.Generic.IEnumerable<System.Int32[]>

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Api.Towers.ModHero"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModHeroLevel.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModHeroLevel.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModHeroLevel.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModHeroLevel.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModHeroLevel_T_.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModHeroLevel_T_.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModHeroLevel_T_.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModHeroLevel_T_.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModParagonUpgrade.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModParagonUpgrade.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModParagonUpgrade.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModParagonUpgrade.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModParagonUpgrade_T_.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModParagonUpgrade_T_.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModParagonUpgrade_T_.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModParagonUpgrade_T_.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModSubTower.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModSubTower.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModSubTower.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModSubTower.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModSubTower_T_.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModSubTower_T_.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModSubTower_T_.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModSubTower_T_.json diff --git a/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModTower.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModTower.json new file mode 100644 index 000000000..13cebfcce --- /dev/null +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModTower.json @@ -0,0 +1 @@ +{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Api.Towers

\n

ModTower Class

\n

Class for adding a custom Tower to the game. Use alongside ModUpgrade to define its upgrades,
\nand optionally ModTowerDisplay to define custom displays for it.

\n
public abstract class ModTower : BTD_Mod_Helper.Api.NamedModContent\n
\n

Inheritance System.ObjectModContentNamedModContent  ModTower

\n

Derived
\n↳ ModHero
\n↳ ModSubTower
\n↳ \">ModTower<T>
\n↳ ModVanillaParagon

\n

Fields

\n

\n

ModTower.MAGIC Field

\n

The string to use for the Magic tower set

\n
protected const string MAGIC = \"Magic\";\n
\n

Field Value

\n

System.String

\n

\n

ModTower.MILITARY Field

\n

The string to use for the Military tower set

\n
protected const string MILITARY = \"Military\";\n
\n

Field Value

\n

System.String

\n

\n

ModTower.PRIMARY Field

\n

The string to use for the Primary tower set

\n
protected const string PRIMARY = \"Primary\";\n
\n

Field Value

\n

System.String

\n

\n

ModTower.SUPPORT Field

\n

The string to use for the Support tower set

\n
protected const string SUPPORT = \"Support\";\n
\n

Field Value

\n

System.String

\n

Properties

\n

\n

ModTower.AlwaysIncludeInChallenge Property

\n

Whether to always make this tower be included in challenges / Bosses / Odysseys etc

\n
public virtual bool AlwaysIncludeInChallenge { get; }\n
\n

Property Value

\n

System.Boolean

\n

\n

ModTower.BaseTower Property

\n

The id of the default BTD Tower that your Tower is going to be copied from by default.

\n
public abstract string BaseTower { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModTower.BottomPathUpgrades Property

\n

The number of upgrades the tower has in it's 3rd / bottom path

\n
public virtual int BottomPathUpgrades { get; }\n
\n

Property Value

\n

System.Int32

\n

\n

ModTower.Cost Property

\n

The in game cost of this tower (on Medium difficulty)

\n
public abstract int Cost { get; }\n
\n

Property Value

\n

System.Int32

\n

\n

ModTower.DontAddToShop Property

\n

Makes this Tower not actually add itself to the shop, useful for making subtowers

\n
public virtual bool DontAddToShop { get; }\n
\n

Property Value

\n

System.Boolean

\n

\n

ModTower.Hotkey Property

\n

Hotkey to use for placing this tower from the shop

\n
public virtual BTD_Mod_Helper.Api.ModOptions.ModSettingHotkey Hotkey { get; }\n
\n

Property Value

\n

ModSettingHotkey

\n

\n

ModTower.Icon Property

\n

The Icon for the Tower's purchase button, by default \"[Name]-Icon\"
\n

\n(Name of .png or .jpg, not including file extension)

\n
public virtual string Icon { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModTower.IconReference Property

\n

If you're not going to use a custom .png for your Icon, use this to directly control its SpriteReference

\n
public virtual SpriteReference IconReference { get; }\n
\n

Property Value

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference

\n

\n

ModTower.IncludeInMonkeyTeams Property

\n

Whether this tower should be allowed to be included in Monkey Teams

\n
public virtual bool IncludeInMonkeyTeams { get; }\n
\n

Property Value

\n

System.Boolean

\n

\n

ModTower.MiddlePathUpgrades Property

\n

The number of upgrades the tower has in it's 2nd / middle path

\n
public virtual int MiddlePathUpgrades { get; }\n
\n

Property Value

\n

System.Int32

\n

\n

ModTower.ParagonMode Property

\n

Defines whether / how this ModTower has a Paragon

\n
public virtual BTD_Mod_Helper.Api.Towers.ParagonMode ParagonMode { get; }\n
\n

Property Value

\n

ParagonMode

\n

\n

ModTower.PixelsPerUnit Property

\n

For 2D towers, the ratio between pixels and display units. Higher number -> smaller tower.
\n

\n
public virtual float PixelsPerUnit { get; }\n
\n

Property Value

\n

System.Single

\n

\n

ModTower.Portrait Property

\n

The Portrait for the 0-0-0 tower, by default \"[Name]-Portrait\"
\n

\n(Name of .png or .jpg, not including file extension)

\n
public virtual string Portrait { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModTower.PortraitReference Property

\n

If you're not going to use a custom .png for your Portrait, use this to directly control its SpriteReference

\n
public virtual SpriteReference PortraitReference { get; }\n
\n

Property Value

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference

\n

\n

ModTower.ShopTowerCount Property

\n

How many of this tower you can buy at once during a game. By default -1 for no limit.

\n
public virtual int ShopTowerCount { get; }\n
\n

Property Value

\n

System.Int32

\n

\n

ModTower.TopPathUpgrades Property

\n

The number of upgrades the tower has in it's 1st / top path

\n
public virtual int TopPathUpgrades { get; }\n
\n

Property Value

\n

System.Int32

\n

\n

ModTower.TowerSet Property

\n

The family of Monkeys that your Tower should be put in.
\n

\nFor now, just use one of the default constants provided of PRIMARY, MILITARY, MAGIC, or SUPPORT.

\n
public abstract TowerSet TowerSet { get; }\n
\n

Property Value

\n

Il2CppAssets.Scripts.Models.TowerSets.TowerSet

\n

\n

ModTower.Use2DModel Property

\n

Whether this Tower should display 2-dimensionally, and search for png images
\n

\n
public virtual bool Use2DModel { get; }\n
\n

Property Value

\n

System.Boolean

\n

Methods

\n

\n

ModTower.Get2DScale(int[]) Method

\n

Gets the scale to use for a 2d tower at the given tiers
\n

\n
public virtual float Get2DScale(params int[] tiers);\n
\n

Parameters

\n

\n

tiers System.Int32[]

\n

Returns

\n

System.Single

\n

\n

ModTower.Get2DTexture(int[]) Method

\n

If this is a 2D tower, gets the name of the .png to use for a given set of tiers
\n

\nDefault Behavior Example: For CardMonkey with tiers 2-3-0, it would try (in order):
\nCardMonkey-230, CardMonkey-X3X, CardMonkey-2XX, CardMonkey
\nGet2DScale(int[])

\n
public virtual string Get2DTexture(params int[] tiers);\n
\n

Parameters

\n

\n

tiers System.Int32[]

\n

Returns

\n

System.String

\n

\n

ModTower.GetBaseTowerModel(int[]) Method

\n

Allows you to change the base TowerModel your tower will use at different tiers. Note that you'd need to be
\ncareful if you entirely changed the base tower you're working with at different tiers, as it will still attempt
\nto apply all the appropriate upgrades. If you would like a ModUpgrade to only have an effect at a given tier,
\nyou could do something like:

\n
public override void ApplyUpgrade(TowerModel towerModel) {  \n    if (towerModel.tiers[Path] != Tier) return;  \n    ...  \n}  \n
\n
public virtual TowerModel GetBaseTowerModel(params int[] tiers);\n
\n

Parameters

\n

\n

tiers System.Int32[]

\n

Length 3 array of Top/Mid/Bot tiers

\n

Returns

\n

Il2CppAssets.Scripts.Models.Towers.TowerModel
\nThe base TowerModel to use

\n

\n

ModTower.GetPortraitReferenceForTiers(int[]) Method

\n

Gets the portrait reference this tower should use for the given tiers
\n

\nLooks for the highest tier ModUpgrade this tower has that defined a
\nPortraitReference,
\nfalling back to the tower's own base PortraitReference by default.

\n
public SpriteReference GetPortraitReferenceForTiers(params int[] tiers);\n
\n

Parameters

\n

\n

tiers System.Int32[]

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference

\n

\n

ModTower.GetTowerIndex(List) Method

\n

When adding this tower to the shop, gets the index at which to add the tower relative to the existing ones.
\n

\nBy default, the tower will be put at the end of the TowerSet category that it's in.

\n
public virtual int GetTowerIndex(System.Collections.Generic.List<TowerDetailsModel> towerSet);\n
\n

Parameters

\n

\n

towerSet System.Collections.Generic.List<Il2CppAssets.Scripts.Models.TowerSets.TowerDetailsModel>

\n

Returns

\n

System.Int32

\n

\n

ModTower.GetUpgradePathModel(ModUpgrade, int[]) Method

\n

Creates an UpgradePathModel for a particular upgrade and new tiers

\n
public virtual UpgradePathModel GetUpgradePathModel(BTD_Mod_Helper.Api.Towers.ModUpgrade modUpgrade, int[] newTiers);\n
\n

Parameters

\n

\n

modUpgrade ModUpgrade

\n

The upgrade

\n

\n

newTiers System.Int32[]

\n

The new desired tiers of the tower

\n

Returns

\n

Il2CppAssets.Scripts.Models.Towers.Upgrades.UpgradePathModel

\n

\n

ModTower.IsUpgradePathClosed(TowerToSimulation, int, bool) Method

\n

Allows you to override whether an UpgradePath should be closed or not for a tower

\n
public virtual System.Nullable<bool> IsUpgradePathClosed(TowerToSimulation tower, int path, bool defaultClosed);\n
\n

Parameters

\n

\n

tower Il2CppAssets.Scripts.Unity.Bridge.TowerToSimulation

\n

The TowerToSimulation

\n

\n

path System.Int32

\n

What path this is for

\n

\n

defaultClosed System.Boolean

\n

Whether it'd be naturally closed or not

\n

Returns

\n

System.Nullable<System.Boolean>
\nWhether the upgrade path should be closed, or null for no change

\n

\n

ModTower.IsValidCrosspath(int[]) Method

\n

Another way to modify the allowable crosspaths for your tower. By default, checks that the highest tier is at
\nmost 5, the next highest is at most 2, and the last one is 0
\n

\nUsed in the default implementation of TowerTiers()

\n
public virtual bool IsValidCrosspath(params int[] tiers);\n
\n

Parameters

\n

\n

tiers System.Int32[]

\n

Returns

\n

System.Boolean

\n

\n

ModTower.MaxUpgradePips(TowerToSimulation, int, int) Method

\n

Allows you to override how many possible Upgrade pips it should show as being possible for a tower to get

\n
public virtual System.Nullable<int> MaxUpgradePips(TowerToSimulation tower, int path, int defaultMax);\n
\n

Parameters

\n

\n

tower Il2CppAssets.Scripts.Unity.Bridge.TowerToSimulation

\n

The TowerToSimulation

\n

\n

path System.Int32

\n

What path this is for

\n

\n

defaultMax System.Int32

\n

The default maximum

\n

Returns

\n

System.Nullable<System.Int32>
\nThe new maximum amount of upgrade pips, or null for no change

\n

\n

ModTower.ModifyBaseTowerModel(TowerModel) Method

\n

Implemented by a ModTower to modify the base tower model before applying any/all ModUpgrades
\n

\nThings like the TowerModel's name, cost, tier, and upgrades are already taken care of before this point

\n
public abstract void ModifyBaseTowerModel(TowerModel towerModel);\n
\n

Parameters

\n

\n

towerModel Il2CppAssets.Scripts.Models.Towers.TowerModel

\n

The Base Tower Model

\n

\n

ModTower.ModifyTowerModelForMatch(TowerModel, GameModel) Method

\n

Further modifies this tower when you go into a new match.
\nUseful for making conditional effects happen based on settings.
\n

\nThe normal ApplyUpgrade effects for all upgrades will have already been applied on game start,
\nso this will simply modify all the TowerModels for this ModTower.

\n
public virtual void ModifyTowerModelForMatch(TowerModel towerModel, GameModel gameModel);\n
\n

Parameters

\n

\n

towerModel Il2CppAssets.Scripts.Models.Towers.TowerModel

\n

\n

gameModel Il2CppAssets.Scripts.Models.GameModel

\n

\n

ModTower.ModifyTowerModelForMatch(TowerModel, IReadOnlyList) Method

\n

Further modifies this tower when you go into a new match.
\nUseful for making conditional effects happen based on settings.
\n

\nThe normal ApplyUpgrade effects for all upgrades will have already been applied on game start,
\nso this will simply modify all the TowerModels for this ModTower.

\n
public virtual void ModifyTowerModelForMatch(TowerModel towerModel, System.Collections.Generic.IReadOnlyList<ModModel> gameModes);\n
\n

Parameters

\n

\n

towerModel Il2CppAssets.Scripts.Models.Towers.TowerModel

\n

\n

gameModes System.Collections.Generic.IReadOnlyList<Il2CppAssets.Scripts.Models.ModModel>

\n

\n

ModTower.TowerTiers() Method

\n

Returns all the valid tiers for the TowerModels of this Tower

\n
public virtual System.Collections.Generic.IEnumerable<int[]> TowerTiers();\n
\n

Returns

\n

System.Collections.Generic.IEnumerable<System.Int32[]>

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Api.Towers.ModTower"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModTowerHelper.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModTowerHelper.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModTowerHelper.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModTowerHelper.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModTowerSet.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModTowerSet.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModTowerSet.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModTowerSet.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModTower_T_.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModTower_T_.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModTower_T_.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModTower_T_.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModUpgrade.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModUpgrade.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModUpgrade.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModUpgrade.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModUpgrade_T_.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModUpgrade_T_.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModUpgrade_T_.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModUpgrade_T_.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModVanillaContent.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModVanillaContent.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModVanillaContent.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModVanillaContent.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModVanillaContent_T_.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModVanillaContent_T_.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModVanillaContent_T_.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModVanillaContent_T_.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModVanillaParagon.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModVanillaParagon.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModVanillaParagon.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModVanillaParagon.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModVanillaTower.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModVanillaTower.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModVanillaTower.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModVanillaTower.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModVanillaTower_T_.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModVanillaTower_T_.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModVanillaTower_T_.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModVanillaTower_T_.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModVanillaUpgrade.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModVanillaUpgrade.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModVanillaUpgrade.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ModVanillaUpgrade.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ParagonMode.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ParagonMode.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ParagonMode.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Api.Towers.ParagonMode.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.BloonsMod.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.BloonsMod.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.BloonsMod.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.BloonsMod.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.BloonsTD6Mod.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.BloonsTD6Mod.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.BloonsTD6Mod.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.BloonsTD6Mod.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.AbilityModelBehaviorExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.AbilityModelBehaviorExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.AbilityModelBehaviorExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.AbilityModelBehaviorExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.AbilityModelExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.AbilityModelExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.AbilityModelExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.AbilityModelExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ActionExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ActionExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ActionExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ActionExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.AddBehaviorToBloonModelExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.AddBehaviorToBloonModelExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.AddBehaviorToBloonModelExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.AddBehaviorToBloonModelExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.AirUnitModelBehaviorExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.AirUnitModelBehaviorExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.AirUnitModelBehaviorExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.AirUnitModelBehaviorExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ArrayExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ArrayExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ArrayExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ArrayExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.AssemblyExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.AssemblyExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.AssemblyExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.AssemblyExt.json diff --git a/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.AttackBehaviorExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.AttackBehaviorExt.json new file mode 100644 index 000000000..76de763da --- /dev/null +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.AttackBehaviorExt.json @@ -0,0 +1 @@ +{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Extensions

\n

AttackBehaviorExt Class

\n

Behavior extensions for attacks

\n
public static class AttackBehaviorExt\n
\n

Inheritance System.Object  AttackBehaviorExt

\n

Methods

\n

\n

AttackBehaviorExt.AddAttackBehavior(this Attack, T) Method

\n

Add a Behavior to this

\n
public static void AddAttackBehavior<T>(this Attack attack, T behavior)\n    where T : AttackBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to add

\n

Parameters

\n

\n

attack Il2CppAssets.Scripts.Simulation.Towers.Behaviors.Attack.Attack

\n

\n

behavior (this Attack, T).T\">T

\n

\n

AttackBehaviorExt.GetAttackBehavior(this Attack) Method

\n

Return the first Behavior of type T

\n
public static T GetAttackBehavior<T>(this Attack attack)\n    where T : AttackBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want

\n

Parameters

\n

\n

attack Il2CppAssets.Scripts.Simulation.Towers.Behaviors.Attack.Attack

\n

Returns

\n

(this Attack).T\">T

\n

\n

AttackBehaviorExt.GetAttackBehaviors(this Attack) Method

\n

Return all Behaviors of type T

\n
public static System.Collections.Generic.List<T> GetAttackBehaviors<T>(this Attack attack)\n    where T : AttackBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want

\n

Parameters

\n

\n

attack Il2CppAssets.Scripts.Simulation.Towers.Behaviors.Attack.Attack

\n

Returns

\n

System.Collections.Generic.List<(this Attack).T\">T>

\n

\n

AttackBehaviorExt.HasAttackBehavior(this Attack, T) Method

\n

Check if this has a specific Behavior

\n
public static bool HasAttackBehavior<T>(this Attack attack, out T item)\n    where T : AttackBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you're checking for

\n

Parameters

\n

\n

attack Il2CppAssets.Scripts.Simulation.Towers.Behaviors.Attack.Attack

\n

\n

item (this Attack, T).T\">T

\n

The returned item, if it exists

\n

Returns

\n

System.Boolean

\n

\n

AttackBehaviorExt.HasAttackBehavior(this Attack) Method

\n

Check if this has a specific Behavior

\n
public static bool HasAttackBehavior<T>(this Attack attack)\n    where T : AttackBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you're checking for

\n

Parameters

\n

\n

attack Il2CppAssets.Scripts.Simulation.Towers.Behaviors.Attack.Attack

\n

Returns

\n

System.Boolean

\n

\n

AttackBehaviorExt.RemoveAttackBehavior(this Attack, T) Method

\n

Remove the first Behavior of type T

\n
public static void RemoveAttackBehavior<T>(this Attack attack, T behavior)\n    where T : AttackBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to remove

\n

Parameters

\n

\n

attack Il2CppAssets.Scripts.Simulation.Towers.Behaviors.Attack.Attack

\n

\n

behavior (this Attack, T).T\">T

\n

\n

AttackBehaviorExt.RemoveAttackBehavior(this Attack) Method

\n

Remove the first Behavior of Type T

\n
public static void RemoveAttackBehavior<T>(this Attack attack)\n    where T : AttackBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to remove

\n

Parameters

\n

\n

attack Il2CppAssets.Scripts.Simulation.Towers.Behaviors.Attack.Attack

\n

\n

AttackBehaviorExt.RemoveAttackBehaviors(this Attack) Method

\n

Remove all Behaviors of type T

\n
public static void RemoveAttackBehaviors<T>(this Attack attack)\n    where T : AttackBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to remove

\n

Parameters

\n

\n

attack Il2CppAssets.Scripts.Simulation.Towers.Behaviors.Attack.Attack

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Extensions.AttackBehaviorExt"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.AttackModelBehaviorExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.AttackModelBehaviorExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.AttackModelBehaviorExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.AttackModelBehaviorExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.AttackModelExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.AttackModelExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.AttackModelExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.AttackModelExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.AudioClipExtensions.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.AudioClipExtensions.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.AudioClipExtensions.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.AudioClipExtensions.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.BloonBehaviorExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.BloonBehaviorExt.json similarity index 73% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.BloonBehaviorExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.BloonBehaviorExt.json index 71ea42e3d..626b50440 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.BloonBehaviorExt.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.BloonBehaviorExt.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Extensions

\n

BloonBehaviorExt Class

\n

Extensions for getting bloon behaviors

\n
public static class BloonBehaviorExt\n
\n

Inheritance System.Object  BloonBehaviorExt

\n

Methods

\n

\n

BloonBehaviorExt.AddBloonBehavior(this Bloon, T) Method

\n

Add a Behavior to this

\n
public static void AddBloonBehavior<T>(this Bloon bloon, T behavior)\n    where T : BloonBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to add

\n

Parameters

\n

\n

bloon Il2CppAssets.Scripts.Simulation.Bloons.Bloon

\n

\n

behavior (this Bloon, T).T\">T

\n

\n

BloonBehaviorExt.GetBloonBehavior(this Bloon) Method

\n

Return the first Behavior of type T

\n
public static T GetBloonBehavior<T>(this Bloon bloon)\n    where T : BloonBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want

\n

Parameters

\n

\n

bloon Il2CppAssets.Scripts.Simulation.Bloons.Bloon

\n

Returns

\n

(this Bloon).T\">T

\n

\n

BloonBehaviorExt.GetBloonBehaviors(this Bloon) Method

\n

Return all Behaviors of type T

\n
public static System.Collections.Generic.List<T> GetBloonBehaviors<T>(this Bloon bloon)\n    where T : BloonBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want

\n

Parameters

\n

\n

bloon Il2CppAssets.Scripts.Simulation.Bloons.Bloon

\n

Returns

\n

System.Collections.Generic.List<(this Bloon).T\">T>

\n

\n

BloonBehaviorExt.HasBloonBehavior(this Bloon) Method

\n

Check if this has a specific Behavior

\n
public static bool HasBloonBehavior<T>(this Bloon bloon)\n    where T : BloonBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you're checking for

\n

Parameters

\n

\n

bloon Il2CppAssets.Scripts.Simulation.Bloons.Bloon

\n

Returns

\n

System.Boolean

\n

\n

BloonBehaviorExt.RemoveBloonBehavior(this Bloon, T) Method

\n

Remove the first Behavior of type T

\n
public static void RemoveBloonBehavior<T>(this Bloon bloon, T behavior)\n    where T : BloonBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to remove

\n

Parameters

\n

\n

bloon Il2CppAssets.Scripts.Simulation.Bloons.Bloon

\n

\n

behavior (this Bloon, T).T\">T

\n

\n

BloonBehaviorExt.RemoveBloonBehavior(this Bloon) Method

\n

Remove the first Behavior of Type T

\n
public static void RemoveBloonBehavior<T>(this Bloon bloon)\n    where T : BloonBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to remove

\n

Parameters

\n

\n

bloon Il2CppAssets.Scripts.Simulation.Bloons.Bloon

\n

\n

BloonBehaviorExt.RemoveBloonBehaviors(this Bloon) Method

\n

Remove all Behaviors of type T

\n
public static void RemoveBloonBehaviors<T>(this Bloon bloon)\n    where T : BloonBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to remove

\n

Parameters

\n

\n

bloon Il2CppAssets.Scripts.Simulation.Bloons.Bloon

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Extensions.BloonBehaviorExt"}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Extensions

\n

BloonBehaviorExt Class

\n

Extensions for getting bloon behaviors

\n
public static class BloonBehaviorExt\n
\n

Inheritance System.Object  BloonBehaviorExt

\n

Methods

\n

\n

BloonBehaviorExt.AddBloonBehavior(this Bloon, T) Method

\n

Add a Behavior to this

\n
public static void AddBloonBehavior<T>(this Bloon bloon, T behavior)\n    where T : BloonBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to add

\n

Parameters

\n

\n

bloon Il2CppAssets.Scripts.Simulation.Bloons.Bloon

\n

\n

behavior (this Bloon, T).T\">T

\n

\n

BloonBehaviorExt.GetBloonBehavior(this Bloon) Method

\n

Return the first Behavior of type T

\n
public static T GetBloonBehavior<T>(this Bloon bloon)\n    where T : BloonBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want

\n

Parameters

\n

\n

bloon Il2CppAssets.Scripts.Simulation.Bloons.Bloon

\n

Returns

\n

(this Bloon).T\">T

\n

\n

BloonBehaviorExt.GetBloonBehaviors(this Bloon) Method

\n

Return all Behaviors of type T

\n
public static System.Collections.Generic.List<T> GetBloonBehaviors<T>(this Bloon bloon)\n    where T : BloonBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want

\n

Parameters

\n

\n

bloon Il2CppAssets.Scripts.Simulation.Bloons.Bloon

\n

Returns

\n

System.Collections.Generic.List<(this Bloon).T\">T>

\n

\n

BloonBehaviorExt.HasBloonBehavior(this Bloon, T) Method

\n

Check if this has a specific Behavior

\n
public static bool HasBloonBehavior<T>(this Bloon bloon, out T item)\n    where T : BloonBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you're checking for

\n

Parameters

\n

\n

bloon Il2CppAssets.Scripts.Simulation.Bloons.Bloon

\n

\n

item (this Bloon, T).T\">T

\n

The found item, if any

\n

Returns

\n

System.Boolean

\n

\n

BloonBehaviorExt.HasBloonBehavior(this Bloon) Method

\n

Check if this has a specific Behavior

\n
public static bool HasBloonBehavior<T>(this Bloon bloon)\n    where T : BloonBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you're checking for

\n

Parameters

\n

\n

bloon Il2CppAssets.Scripts.Simulation.Bloons.Bloon

\n

Returns

\n

System.Boolean

\n

\n

BloonBehaviorExt.RemoveBloonBehavior(this Bloon, T) Method

\n

Remove the first Behavior of type T

\n
public static void RemoveBloonBehavior<T>(this Bloon bloon, T behavior)\n    where T : BloonBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to remove

\n

Parameters

\n

\n

bloon Il2CppAssets.Scripts.Simulation.Bloons.Bloon

\n

\n

behavior (this Bloon, T).T\">T

\n

\n

BloonBehaviorExt.RemoveBloonBehavior(this Bloon) Method

\n

Remove the first Behavior of Type T

\n
public static void RemoveBloonBehavior<T>(this Bloon bloon)\n    where T : BloonBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to remove

\n

Parameters

\n

\n

bloon Il2CppAssets.Scripts.Simulation.Bloons.Bloon

\n

\n

BloonBehaviorExt.RemoveBloonBehaviors(this Bloon) Method

\n

Remove all Behaviors of type T

\n
public static void RemoveBloonBehaviors<T>(this Bloon bloon)\n    where T : BloonBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to remove

\n

Parameters

\n

\n

bloon Il2CppAssets.Scripts.Simulation.Bloons.Bloon

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Extensions.BloonBehaviorExt"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.BloonExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.BloonExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.BloonExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.BloonExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.BloonModelBehaviorExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.BloonModelBehaviorExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.BloonModelBehaviorExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.BloonModelBehaviorExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.BloonModelExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.BloonModelExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.BloonModelExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.BloonModelExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.BloonToSimulationExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.BloonToSimulationExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.BloonToSimulationExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.BloonToSimulationExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.BloonsTD6ModExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.BloonsTD6ModExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.BloonsTD6ModExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.BloonsTD6ModExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ButtonClickedEventExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ButtonClickedEventExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ButtonClickedEventExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ButtonClickedEventExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ButtonExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ButtonExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ButtonExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ButtonExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ComponentExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ComponentExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ComponentExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ComponentExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.DeconstructExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.DeconstructExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.DeconstructExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.DeconstructExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.DictionaryExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.DictionaryExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.DictionaryExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.DictionaryExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.DirectoryInfoExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.DirectoryInfoExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.DirectoryInfoExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.DirectoryInfoExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.DisplayModelExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.DisplayModelExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.DisplayModelExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.DisplayModelExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.DumpNodeExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.DumpNodeExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.DumpNodeExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.DumpNodeExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.EmissionModelBehaviorExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.EmissionModelBehaviorExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.EmissionModelBehaviorExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.EmissionModelBehaviorExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.EntityBehaviorExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.EntityBehaviorExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.EntityBehaviorExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.EntityBehaviorExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.EntityExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.EntityExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.EntityExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.EntityExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.FileInfoExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.FileInfoExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.FileInfoExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.FileInfoExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Function().json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Function().json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Function().json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Function().json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.FunctionExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.FunctionExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.FunctionExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.FunctionExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Function_T_().json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Function_T_().json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Function_T_().json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Function_T_().json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.GameExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.GameExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.GameExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.GameExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.GameModelExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.GameModelExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.GameModelExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.GameModelExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.GameObjectExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.GameObjectExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.GameObjectExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.GameObjectExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.GrowModelExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.GrowModelExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.GrowModelExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.GrowModelExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.HarmonyExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.HarmonyExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.HarmonyExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.HarmonyExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.IEnumerableExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.IEnumerableExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.IEnumerableExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.IEnumerableExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppGenericIEnumerable.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppGenericIEnumerable.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppGenericIEnumerable.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppGenericIEnumerable.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppGenericIEnumerableExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppGenericIEnumerableExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppGenericIEnumerableExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppGenericIEnumerableExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppGenerics.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppGenerics.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppGenerics.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppGenerics.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppGenericsExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppGenericsExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppGenericsExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppGenericsExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppIEnumerator.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppIEnumerator.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppIEnumerator.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppIEnumerator.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppIEnumeratorExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppIEnumeratorExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppIEnumeratorExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppIEnumeratorExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppReferenceArray.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppReferenceArray.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppReferenceArray.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppReferenceArray.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppReferenceArrayExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppReferenceArrayExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppReferenceArrayExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppReferenceArrayExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppStringArrayExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppStringArrayExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppStringArrayExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppStringArrayExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppSystemDelegateExxt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppSystemDelegateExxt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppSystemDelegateExxt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppSystemDelegateExxt.json diff --git a/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppSystemDictionaryExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppSystemDictionaryExt.json new file mode 100644 index 000000000..c9316a690 --- /dev/null +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppSystemDictionaryExt.json @@ -0,0 +1 @@ +{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Extensions

\n

Il2CppSystemDictionaryExt Class

\n

Extensions for il2cpp dictionaries

\n
public static class Il2CppSystemDictionaryExt\n
\n

Inheritance System.Object  Il2CppSystemDictionaryExt

\n

Methods

\n

\n

Il2CppSystemDictionaryExt.Deconstruct<K,V>(this KeyValuePair<K,V>, K, V) Method

\n

Deconstruct method of IL2CPP KeyValuePairs

\n
public static void Deconstruct<K,V>(this KeyValuePair<K,V> kvp, out K k, out V v);\n
\n

Type parameters

\n

\n

K

\n

\n

V

\n

Parameters

\n

\n

kvp Il2CppSystem.Collections.Generic.KeyValuePair

\n

\n

k (this KeyValuePair, K, V).K\">K

\n

\n

v (this KeyValuePair, K, V).V\">V

\n

\n

Il2CppSystemDictionaryExt.GetKeys<TKey,TValue>(this Dictionary<TKey,TValue>) Method

\n

Get all of the keys from this Dictionary as a list

\n
public static List<TKey> GetKeys<TKey,TValue>(this Dictionary<TKey,TValue> keyValuePairs);\n
\n

Type parameters

\n

\n

TKey

\n

\n

TValue

\n

Parameters

\n

\n

keyValuePairs Il2CppSystem.Collections.Generic.Dictionary

\n

Returns

\n

Il2CppSystem.Collections.Generic.List

\n

\n

Il2CppSystemDictionaryExt.GetValues<TKey,TValue>(this Dictionary<TKey,TValue>) Method

\n

Get all of the values from this Dictionary as a list

\n
public static List<TValue> GetValues<TKey,TValue>(this Dictionary<TKey,TValue> keyValuePairs);\n
\n

Type parameters

\n

\n

TKey

\n

\n

TValue

\n

Parameters

\n

\n

keyValuePairs Il2CppSystem.Collections.Generic.Dictionary

\n

Returns

\n

Il2CppSystem.Collections.Generic.List

\n

\n

Il2CppSystemDictionaryExt.Keys<TKey,TValue>(this Dictionary<TKey,TValue>) Method

\n

Get all of the keys from this Dictionary

\n
public static System.Collections.Generic.IEnumerable<TKey> Keys<TKey,TValue>(this Dictionary<TKey,TValue> keyValuePairs);\n
\n

Type parameters

\n

\n

TKey

\n

\n

TValue

\n

Parameters

\n

\n

keyValuePairs Il2CppSystem.Collections.Generic.Dictionary

\n

Returns

\n

System.Collections.Generic.IEnumerable<(this Dictionary).TKey\">TKey>

\n

\n

Il2CppSystemDictionaryExt.Values<TKey,TValue>(this Dictionary<TKey,TValue>) Method

\n

Get all of the values from this Dictionary

\n
public static System.Collections.Generic.IEnumerable<TValue> Values<TKey,TValue>(this Dictionary<TKey,TValue> keyValuePairs);\n
\n

Type parameters

\n

\n

TKey

\n

\n

TValue

\n

Parameters

\n

\n

keyValuePairs Il2CppSystem.Collections.Generic.Dictionary

\n

Returns

\n

System.Collections.Generic.IEnumerable<(this Dictionary).TValue\">TValue>

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Extensions.Il2CppSystemDictionaryExt"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppSystemObjectExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppSystemObjectExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppSystemObjectExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Il2CppSystemObjectExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ImageExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ImageExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ImageExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ImageExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.InGameExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.InGameExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.InGameExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.InGameExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.InputFieldExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.InputFieldExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.InputFieldExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.InputFieldExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.InputFieldOnValueChanged.Function(string).json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.InputFieldOnValueChanged.Function(string).json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.InputFieldOnValueChanged.Function(string).json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.InputFieldOnValueChanged.Function(string).json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.InputFieldOnValueChanged.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.InputFieldOnValueChanged.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.InputFieldOnValueChanged.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.InputFieldOnValueChanged.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.InputFieldSubmitEvent.Function(string).json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.InputFieldSubmitEvent.Function(string).json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.InputFieldSubmitEvent.Function(string).json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.InputFieldSubmitEvent.Function(string).json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.InputFieldSubmitEvent.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.InputFieldSubmitEvent.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.InputFieldSubmitEvent.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.InputFieldSubmitEvent.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.LayoutGroupExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.LayoutGroupExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.LayoutGroupExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.LayoutGroupExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ListExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ListExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ListExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ListExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.LocalizationManagerExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.LocalizationManagerExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.LocalizationManagerExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.LocalizationManagerExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.LockedList.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.LockedList.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.LockedList.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.LockedList.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.LockedListExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.LockedListExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.LockedListExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.LockedListExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.MapExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.MapExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.MapExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.MapExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.MiscModelExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.MiscModelExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.MiscModelExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.MiscModelExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ModModelExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ModModelExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ModModelExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ModModelExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ModelExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ModelExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ModelExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ModelExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.NKMultiGameInterfaceExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.NKMultiGameInterfaceExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.NKMultiGameInterfaceExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.NKMultiGameInterfaceExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.NK_TextMeshProUGUIExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.NK_TextMeshProUGUIExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.NK_TextMeshProUGUIExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.NK_TextMeshProUGUIExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.PetModelBehaviorExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.PetModelBehaviorExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.PetModelBehaviorExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.PetModelBehaviorExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.PopupScreenExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.PopupScreenExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.PopupScreenExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.PopupScreenExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.PowerModelBehaviorExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.PowerModelBehaviorExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.PowerModelBehaviorExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.PowerModelBehaviorExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ProfileModelExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ProfileModelExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ProfileModelExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ProfileModelExt.json diff --git a/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ProjectileBehaviorExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ProjectileBehaviorExt.json new file mode 100644 index 000000000..d16dd3a3c --- /dev/null +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ProjectileBehaviorExt.json @@ -0,0 +1 @@ +{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Extensions

\n

ProjectileBehaviorExt Class

\n

Behavior extensions for projectiles

\n
public static class ProjectileBehaviorExt\n
\n

Inheritance System.Object  ProjectileBehaviorExt

\n

Methods

\n

\n

ProjectileBehaviorExt.AddProjectileBehavior(this Projectile, T) Method

\n

Add a Behavior to this

\n
public static void AddProjectileBehavior<T>(this Projectile projectile, T behavior)\n    where T : ProjectileBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

projectile Il2CppAssets.Scripts.Simulation.Towers.Projectiles.Projectile

\n

\n

behavior (this Projectile, T).T\">T

\n

\n

ProjectileBehaviorExt.GetProjectileBehavior(this Projectile) Method

\n

Return the first Behavior of type T

\n
public static T GetProjectileBehavior<T>(this Projectile projectile)\n    where T : ProjectileBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

projectile Il2CppAssets.Scripts.Simulation.Towers.Projectiles.Projectile

\n

Returns

\n

(this Projectile).T\">T

\n

\n

ProjectileBehaviorExt.GetProjectileBehaviors(this Projectile) Method

\n

Return all Behaviors of type T

\n
public static System.Collections.Generic.List<T> GetProjectileBehaviors<T>(this Projectile projectile)\n    where T : ProjectileBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

projectile Il2CppAssets.Scripts.Simulation.Towers.Projectiles.Projectile

\n

Returns

\n

System.Collections.Generic.List<(this Projectile).T\">T>

\n

\n

ProjectileBehaviorExt.HasProjectileBehavior(this Projectile, T) Method

\n

Check if this has a specific Behavior

\n
public static bool HasProjectileBehavior<T>(this Projectile projectile, out T item)\n    where T : ProjectileBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

projectile Il2CppAssets.Scripts.Simulation.Towers.Projectiles.Projectile

\n

\n

item (this Projectile, T).T\">T

\n

Returns

\n

System.Boolean

\n

\n

ProjectileBehaviorExt.HasProjectileBehavior(this Projectile) Method

\n

Check if this has a specific Behavior

\n
public static bool HasProjectileBehavior<T>(this Projectile projectile)\n    where T : ProjectileBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

projectile Il2CppAssets.Scripts.Simulation.Towers.Projectiles.Projectile

\n

Returns

\n

System.Boolean

\n

\n

ProjectileBehaviorExt.RemoveProjectileBehavior(this Projectile, T) Method

\n

Remove the first Behavior of type T

\n
public static void RemoveProjectileBehavior<T>(this Projectile projectile, T behavior)\n    where T : ProjectileBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

projectile Il2CppAssets.Scripts.Simulation.Towers.Projectiles.Projectile

\n

\n

behavior (this Projectile, T).T\">T

\n

\n

ProjectileBehaviorExt.RemoveProjectileBehavior(this Projectile) Method

\n

Remove the first Behavior of Type T

\n
public static void RemoveProjectileBehavior<T>(this Projectile projectile)\n    where T : ProjectileBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

projectile Il2CppAssets.Scripts.Simulation.Towers.Projectiles.Projectile

\n

\n

ProjectileBehaviorExt.RemoveProjectileBehaviors(this Projectile) Method

\n

Remove all Behaviors of type T

\n
public static void RemoveProjectileBehaviors<T>(this Projectile projectile)\n    where T : ProjectileBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

projectile Il2CppAssets.Scripts.Simulation.Towers.Projectiles.Projectile

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Extensions.ProjectileBehaviorExt"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ProjectileExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ProjectileExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ProjectileExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ProjectileExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ProjectileModelBehaviorExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ProjectileModelBehaviorExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ProjectileModelBehaviorExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ProjectileModelBehaviorExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ProjectileModelExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ProjectileModelExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ProjectileModelExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ProjectileModelExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.RendererExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.RendererExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.RendererExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.RendererExt.json diff --git a/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.RootObjectLockList.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.RootObjectLockList.json new file mode 100644 index 000000000..8e10ff30e --- /dev/null +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.RootObjectLockList.json @@ -0,0 +1 @@ +{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Extensions

\n

RootObjectLockList Class

\n

Extensions for RootObjectLockLists

\n
public static class RootObjectLockList\n
\n

Inheritance System.Object  RootObjectLockList

\n

Methods

\n

\n

RootObjectLockList.AddTo<TSource,TCast>(this RootObjectLockList, TCast) Method

\n

Return this with an additional Item added to it

\n
public static RootObjectLockList<TSource> AddTo<TSource,TCast>(this RootObjectLockList<TSource> lockList, TCast objectToAdd)\n    where TSource : RootObject\n    where TCast : RootObject;\n
\n

Type parameters

\n

\n

TSource

\n

\n

TCast

\n

The Type of the Item to add

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

\n

objectToAdd (this RootObjectLockList, TCast).TCast\">TCast

\n

Item to add

\n

Returns

\n

Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

\n

RootObjectLockList.Duplicate(this RootObjectLockList) Method

\n

Return a duplicate of this

\n
public static RootObjectLockList<T> Duplicate<T>(this RootObjectLockList<T> list)\n    where T : RootObject;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

list Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

Returns

\n

Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

\n

RootObjectLockList.DuplicateAs<TSource,TCast>(this RootObjectLockList) Method

\n

Return a duplicate of this as type TCast

\n
public static RootObjectLockList<TCast> DuplicateAs<TSource,TCast>(this RootObjectLockList<TSource> list)\n    where TSource : RootObject\n    where TCast : RootObject;\n
\n

Type parameters

\n

\n

TSource

\n

\n

TCast

\n

Parameters

\n

\n

list Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

Returns

\n

Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

\n

RootObjectLockList.GetItemOfType<TSource,TCast>(this RootObjectLockList) Method

\n
public static TCast GetItemOfType<TSource,TCast>(this RootObjectLockList<TSource> lockList)\n    where TSource : RootObject\n    where TCast : RootObject;\n
\n

Type parameters

\n

\n

TSource

\n

\n

TCast

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

Returns

\n

(this RootObjectLockList).TCast\">TCast

\n

\n

RootObjectLockList.GetItemsOfType<TSource,TCast>(this RootObjectLockList) Method

\n

Return all Items of type TCast

\n
public static System.Collections.Generic.List<TCast> GetItemsOfType<TSource,TCast>(this RootObjectLockList<TSource> lockList)\n    where TSource : RootObject\n    where TCast : RootObject;\n
\n

Type parameters

\n

\n

TSource

\n

\n

TCast

\n

The Type of the Items you want

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

Returns

\n

System.Collections.Generic.List<(this RootObjectLockList).TCast\">TCast>

\n

\n

RootObjectLockList.HasItemsOfType<TSource,TCast>(this RootObjectLockList, TCast) Method

\n

Check if this has any items of type TCast

\n
public static bool HasItemsOfType<TSource,TCast>(this RootObjectLockList<TSource> lockList, out TCast item)\n    where TSource : RootObject\n    where TCast : RootObject;\n
\n

Type parameters

\n

\n

TSource

\n

\n

TCast

\n

The Type you're checking for

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

\n

item (this RootObjectLockList, TCast).TCast\">TCast

\n

The found item, if any

\n

Returns

\n

System.Boolean

\n

\n

RootObjectLockList.HasItemsOfType<TSource,TCast>(this RootObjectLockList) Method

\n

Check if this has any items of type TCast

\n
public static bool HasItemsOfType<TSource,TCast>(this RootObjectLockList<TSource> lockList)\n    where TSource : RootObject\n    where TCast : RootObject;\n
\n

Type parameters

\n

\n

TSource

\n

\n

TCast

\n

The Type you're checking for

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

Returns

\n

System.Boolean

\n

\n

RootObjectLockList.RemoveItem<TSource,TCast>(this RootObjectLockList, TCast) Method

\n

Return this with the first Item of type TCast removed

\n
public static RootObjectLockList<TSource> RemoveItem<TSource,TCast>(this RootObjectLockList<TSource> lockList, TCast itemToRemove)\n    where TSource : RootObject\n    where TCast : RootObject;\n
\n

Type parameters

\n

\n

TSource

\n

\n

TCast

\n

The Type of the Item you want to remove

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

\n

itemToRemove (this RootObjectLockList, TCast).TCast\">TCast

\n

The specific Item to remove

\n

Returns

\n

Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

\n

RootObjectLockList.RemoveItemOfType<TSource,TCast>(this RootObjectLockList) Method

\n

Return this with the first Item of type TCast removed

\n
public static RootObjectLockList<TSource> RemoveItemOfType<TSource,TCast>(this RootObjectLockList<TSource> lockList)\n    where TSource : RootObject\n    where TCast : RootObject;\n
\n

Type parameters

\n

\n

TSource

\n

\n

TCast

\n

The Type of the Item you want to remove

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

Returns

\n

Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

\n

RootObjectLockList.RemoveItemsOfType<TSource,TCast>(this RootObjectLockList) Method

\n

Return this with all Items of type TCast removed

\n
public static RootObjectLockList<TSource> RemoveItemsOfType<TSource,TCast>(this RootObjectLockList<TSource> lockList)\n    where TSource : RootObject\n    where TCast : RootObject;\n
\n

Type parameters

\n

\n

TSource

\n

\n

TCast

\n

The Type of the Items that you want to remove

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

Returns

\n

Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

\n

RootObjectLockList.ToArray(this RootObjectLockList) Method

\n

Return as System.Array

\n
public static T[] ToArray<T>(this RootObjectLockList<T> lockList)\n    where T : RootObject;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

Returns

\n

(this RootObjectLockList).T\">T[]

\n

\n

RootObjectLockList.ToIl2CppList(this RootObjectLockList) Method

\n

Return as Il2CppSystem.List

\n
public static List<T> ToIl2CppList<T>(this RootObjectLockList<T> lockList)\n    where T : RootObject;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

Returns

\n

Il2CppSystem.Collections.Generic.List

\n

\n

RootObjectLockList.ToIl2CppReferenceArray(this RootObjectLockList) Method

\n

Return as Il2CppReferenceArray

\n
public static Il2CppReferenceArray<T> ToIl2CppReferenceArray<T>(this RootObjectLockList<T> lockList)\n    where T : RootObject;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

Returns

\n

Il2CppInterop.Runtime.InteropTypes.Arrays.Il2CppReferenceArray

\n

\n

RootObjectLockList.ToList(this RootObjectLockList) Method

\n

Return as System.List

\n
public static System.Collections.Generic.List<T> ToList<T>(this RootObjectLockList<T> lockList)\n    where T : RootObject;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

Returns

\n

System.Collections.Generic.List<(this RootObjectLockList).T\">T>

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Extensions.RootObjectLockList"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.RoundModelExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.RoundModelExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.RoundModelExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.RoundModelExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.SelectableObjectExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.SelectableObjectExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.SelectableObjectExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.SelectableObjectExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.SliderEventExt.Function(float).json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.SliderEventExt.Function(float).json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.SliderEventExt.Function(float).json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.SliderEventExt.Function(float).json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.SliderEventExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.SliderEventExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.SliderEventExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.SliderEventExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.SpawnerExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.SpawnerExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.SpawnerExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.SpawnerExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.SpriteExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.SpriteExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.SpriteExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.SpriteExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.SpriteReferenceExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.SpriteReferenceExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.SpriteReferenceExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.SpriteReferenceExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.StandardTowerPurchaseButtonExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.StandardTowerPurchaseButtonExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.StandardTowerPurchaseButtonExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.StandardTowerPurchaseButtonExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.StreamExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.StreamExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.StreamExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.StreamExt.json diff --git a/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.StringExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.StringExt.json new file mode 100644 index 000000000..f26e685ed --- /dev/null +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.StringExt.json @@ -0,0 +1 @@ +{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Extensions

\n

StringExt Class

\n

Extensions for strings

\n
public static class StringExt\n
\n

Inheritance System.Object  StringExt

\n

Methods

\n

\n

StringExt.GetBtd6Localization(this string, bool) Method

\n

Gets the localization from the current localization text table, or the default one if it's not present in the current one.
\nIf the id is not present in any of these, returned as spaced or not spaced depending on parameters.

\n
public static string GetBtd6Localization(this string id, bool returnAsSpacedIfNoEntry=true);\n
\n

Parameters

\n

\n

id System.String

\n

The ID of the thing you're trying to get the localization of.

\n

\n

returnAsSpacedIfNoEntry System.Boolean

\n

Should this return the id with spaces if there's no localization present?

\n

Returns

\n

System.String

\n

\n

StringExt.Localize(this string) Method

\n

Gets the localization from the current localization text table, or the default one if it's not present in the current one.
\nIf the id is not present in any of these, returned as spaced or not spaced depending on parameters.

\n
public static string Localize(this string id);\n
\n

Parameters

\n

\n

id System.String

\n

The ID of the thing you're trying to get the localization of.

\n

Returns

\n

System.String

\n

\n

StringExt.NullIfEmpty(this string) Method

\n

Returns null if a string is empty / whitespace, otherwise just returns back the string

\n
public static string NullIfEmpty(this string s);\n
\n

Parameters

\n

\n

s System.String

\n

Returns

\n

System.String

\n

\n

StringExt.RegexReplace(this string, string, string) Method

\n\n
public static string RegexReplace(this string input, string pattern, string replacement);\n
\n

Parameters

\n

\n

input System.String

\n

\n

pattern System.String

\n

\n

replacement System.String

\n

Returns

\n

System.String

\n

\n

StringExt.Spaced(this string) Method

\n

Puts spaces between capitalized words within a string

\n
public static string Spaced(this string s);\n
\n

Parameters

\n

\n

s System.String

\n

Returns

\n

System.String

\n

\n

StringExt.ToTitleCase(this string) Method

\n\n
public static string ToTitleCase(this string input);\n
\n

Parameters

\n

\n

input System.String

\n

Returns

\n

System.String

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Extensions.StringExt"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.SupportModelExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.SupportModelExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.SupportModelExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.SupportModelExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Texture2DExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Texture2DExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Texture2DExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Texture2DExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ToggleEventExt.Function(bool).json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ToggleEventExt.Function(bool).json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ToggleEventExt.Function(bool).json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ToggleEventExt.Function(bool).json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ToggleEventExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ToggleEventExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ToggleEventExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ToggleEventExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ToggleExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ToggleExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ToggleExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.ToggleExt.json diff --git a/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.TowerBehaviorExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.TowerBehaviorExt.json new file mode 100644 index 000000000..acf12ed25 --- /dev/null +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.TowerBehaviorExt.json @@ -0,0 +1 @@ +{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Extensions

\n

TowerBehaviorExt Class

\n

Behavior extensions for Towers

\n
public static class TowerBehaviorExt\n
\n

Inheritance System.Object  TowerBehaviorExt

\n

Methods

\n

\n

TowerBehaviorExt.AddTowerBehavior(this Tower, T) Method

\n

Add a Behavior to this

\n
public static void AddTowerBehavior<T>(this Tower tower, T behavior)\n    where T : TowerBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

tower Il2CppAssets.Scripts.Simulation.Towers.Tower

\n

\n

behavior (this Tower, T).T\">T

\n

\n

TowerBehaviorExt.GetTowerBehavior(this Tower) Method

\n

Return the first Behavior of type T

\n
public static T GetTowerBehavior<T>(this Tower tower)\n    where T : TowerBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

tower Il2CppAssets.Scripts.Simulation.Towers.Tower

\n

Returns

\n

(this Tower).T\">T

\n

\n

TowerBehaviorExt.GetTowerBehaviors(this Tower) Method

\n

Return all Behaviors of type T

\n
public static System.Collections.Generic.List<T> GetTowerBehaviors<T>(this Tower tower)\n    where T : TowerBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

tower Il2CppAssets.Scripts.Simulation.Towers.Tower

\n

Returns

\n

System.Collections.Generic.List<(this Tower).T\">T>

\n

\n

TowerBehaviorExt.HasTowerBehavior(this Tower, T) Method

\n

Check if this has a specific Behavior

\n
public static bool HasTowerBehavior<T>(this Tower tower, out T item)\n    where T : TowerBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

tower Il2CppAssets.Scripts.Simulation.Towers.Tower

\n

\n

item (this Tower, T).T\">T

\n

Returns

\n

System.Boolean

\n

\n

TowerBehaviorExt.HasTowerBehavior(this Tower) Method

\n

Check if this has a specific Behavior

\n
public static bool HasTowerBehavior<T>(this Tower tower)\n    where T : TowerBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

tower Il2CppAssets.Scripts.Simulation.Towers.Tower

\n

Returns

\n

System.Boolean

\n

\n

TowerBehaviorExt.RemoveTowerBehavior(this Tower, T) Method

\n

Remove the first Behavior of type T

\n
public static void RemoveTowerBehavior<T>(this Tower tower, T behavior)\n    where T : TowerBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

tower Il2CppAssets.Scripts.Simulation.Towers.Tower

\n

\n

behavior (this Tower, T).T\">T

\n

\n

TowerBehaviorExt.RemoveTowerBehavior(this Tower) Method

\n

Remove the first Behavior of Type T

\n
public static void RemoveTowerBehavior<T>(this Tower tower)\n    where T : TowerBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

tower Il2CppAssets.Scripts.Simulation.Towers.Tower

\n

\n

TowerBehaviorExt.RemoveTowerBehaviors(this Tower) Method

\n

Remove all Behaviors of type T

\n
public static void RemoveTowerBehaviors<T>(this Tower tower)\n    where T : TowerBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

tower Il2CppAssets.Scripts.Simulation.Towers.Tower

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Extensions.TowerBehaviorExt"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.TowerDetailsModelExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.TowerDetailsModelExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.TowerDetailsModelExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.TowerDetailsModelExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.TowerExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.TowerExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.TowerExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.TowerExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.TowerModelBehaviorExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.TowerModelBehaviorExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.TowerModelBehaviorExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.TowerModelBehaviorExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.TowerModelExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.TowerModelExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.TowerModelExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.TowerModelExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.TowerToSimulationExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.TowerToSimulationExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.TowerToSimulationExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.TowerToSimulationExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.TypeExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.TypeExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.TypeExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.TypeExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.UnityDisplayNodeExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.UnityDisplayNodeExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.UnityDisplayNodeExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.UnityDisplayNodeExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.UpgradeModelExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.UpgradeModelExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.UpgradeModelExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.UpgradeModelExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Vector3Ext.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Vector3Ext.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Vector3Ext.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.Vector3Ext.json diff --git a/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.WeaponBehaviorExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.WeaponBehaviorExt.json new file mode 100644 index 000000000..950e5b00a --- /dev/null +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.WeaponBehaviorExt.json @@ -0,0 +1 @@ +{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Extensions

\n

WeaponBehaviorExt Class

\n

Behavior extensions for Weapons

\n
public static class WeaponBehaviorExt\n
\n

Inheritance System.Object  WeaponBehaviorExt

\n

Methods

\n

\n

WeaponBehaviorExt.AddWeaponBehavior(this Weapon, T) Method

\n

Add a Behavior to this

\n
public static void AddWeaponBehavior<T>(this Weapon weapon, T behavior)\n    where T : WeaponBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to add

\n

Parameters

\n

\n

weapon Il2CppAssets.Scripts.Simulation.Towers.Weapons.Weapon

\n

\n

behavior (this Weapon, T).T\">T

\n

\n

WeaponBehaviorExt.GetWeaponBehavior(this Weapon) Method

\n

Return the first Behavior of type T

\n
public static T GetWeaponBehavior<T>(this Weapon weapon)\n    where T : WeaponBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want

\n

Parameters

\n

\n

weapon Il2CppAssets.Scripts.Simulation.Towers.Weapons.Weapon

\n

Returns

\n

(this Weapon).T\">T

\n

\n

WeaponBehaviorExt.GetWeaponBehaviors(this Weapon) Method

\n

Return all Behaviors of type T

\n
public static System.Collections.Generic.List<T> GetWeaponBehaviors<T>(this Weapon weapon)\n    where T : WeaponBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want

\n

Parameters

\n

\n

weapon Il2CppAssets.Scripts.Simulation.Towers.Weapons.Weapon

\n

Returns

\n

System.Collections.Generic.List<(this Weapon).T\">T>

\n

\n

WeaponBehaviorExt.HasAttackBehavior(this Weapon, T) Method

\n

Check if this has a specific Behavior

\n
public static bool HasAttackBehavior<T>(this Weapon weapon, out T item)\n    where T : WeaponBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you're checking for

\n

Parameters

\n

\n

weapon Il2CppAssets.Scripts.Simulation.Towers.Weapons.Weapon

\n

\n

item (this Weapon, T).T\">T

\n

The returned item, if it exists

\n

Returns

\n

System.Boolean

\n

\n

WeaponBehaviorExt.HasWeaponBehavior(this Weapon) Method

\n

Check if this has a specific Behavior

\n
public static bool HasWeaponBehavior<T>(this Weapon weapon)\n    where T : WeaponBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you're checking for

\n

Parameters

\n

\n

weapon Il2CppAssets.Scripts.Simulation.Towers.Weapons.Weapon

\n

Returns

\n

System.Boolean

\n

\n

WeaponBehaviorExt.RemoveWeaponBehavior(this Weapon, T) Method

\n

Remove the first Behavior of type T

\n
public static void RemoveWeaponBehavior<T>(this Weapon weapon, T behavior)\n    where T : WeaponBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to remove

\n

Parameters

\n

\n

weapon Il2CppAssets.Scripts.Simulation.Towers.Weapons.Weapon

\n

\n

behavior (this Weapon, T).T\">T

\n

\n

WeaponBehaviorExt.RemoveWeaponBehavior(this Weapon) Method

\n

Remove the first Behavior of Type T

\n
public static void RemoveWeaponBehavior<T>(this Weapon weapon)\n    where T : WeaponBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to remove

\n

Parameters

\n

\n

weapon Il2CppAssets.Scripts.Simulation.Towers.Weapons.Weapon

\n

\n

WeaponBehaviorExt.RemoveWeaponBehaviors(this Weapon) Method

\n

Remove all Behaviors of type T

\n
public static void RemoveWeaponBehaviors<T>(this Weapon weapon)\n    where T : WeaponBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to remove

\n

Parameters

\n

\n

weapon Il2CppAssets.Scripts.Simulation.Towers.Weapons.Weapon

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Extensions.WeaponBehaviorExt"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.WeaponModelBehaviorExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.WeaponModelBehaviorExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.WeaponModelBehaviorExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.WeaponModelBehaviorExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.WeaponModelExt.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.WeaponModelExt.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.WeaponModelExt.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.Extensions.WeaponModelExt.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.ModHelper.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.ModHelper.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.ModHelper.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.ModHelper.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.UI.BTD6.MainMenuUI.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.UI.BTD6.MainMenuUI.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.UI.BTD6.MainMenuUI.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.UI.BTD6.MainMenuUI.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.UI.BTD6.MapSelectUI.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.UI.BTD6.MapSelectUI.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.UI.BTD6.MapSelectUI.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.UI.BTD6.MapSelectUI.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.UI.BTD6.TitleScreenUI.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.UI.BTD6.TitleScreenUI.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.UI.BTD6.TitleScreenUI.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.UI.BTD6.TitleScreenUI.json diff --git a/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.UI.Menus.ModSettingsMenu.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.UI.Menus.ModSettingsMenu.json new file mode 100644 index 000000000..705748ebd --- /dev/null +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.UI.Menus.ModSettingsMenu.json @@ -0,0 +1 @@ +{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.UI.Menus

\n

ModSettingsMenu Class

\n

The ModGameMenu for Mod Settings

\n
public class ModSettingsMenu : BTD_Mod_Helper.Api.ModGameMenu<HotkeysScreen>\n
\n

Inheritance System.ObjectModContentModGameMenu\">BTD_Mod_Helper.Api.ModGameMenu<Il2CppAssets.Scripts.Unity.UI_New.Settings.HotkeysScreen\">>  ModSettingsMenu

\n

Properties

\n

\n

ModSettingsMenu.BloonsMod Property

\n

The most recent mod with opened settings

\n
public static BTD_Mod_Helper.BloonsMod BloonsMod { get; set; }\n
\n

Property Value

\n

BloonsMod

\n

Methods

\n

\n

ModSettingsMenu.OnMenuClosed() Method

\n

Runs right as your custom menu is being closed

\n
public override void OnMenuClosed();\n
\n

\n

ModSettingsMenu.OnMenuOpened(Object) Method

\n

Runs right as your custom menu is being opened, with the optional data argument that can be passed into
\n(Object, Object)\">Open<T>(Object, Object)

\n
public override bool OnMenuOpened(Object data);\n
\n

Parameters

\n

\n

data Il2CppSystem.Object

\n

Returns

\n

System.Boolean
\nWhether to run the base menu's OnOpen code

\n

\n

ModSettingsMenu.OnMenuUpdate() Method

\n

Runs every time that your custom menu updates

\n
public override void OnMenuUpdate();\n
\n

\n

ModSettingsMenu.Open(BloonsMod) Method

\n

Opens the Mod Settings for a specific mod

\n
public static void Open(BTD_Mod_Helper.BloonsMod mod);\n
\n

Parameters

\n

\n

mod BloonsMod

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.UI.Menus.ModSettingsMenu"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.UI.Modded.RoundSetChanger.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.UI.Modded.RoundSetChanger.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.UI.Modded.RoundSetChanger.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/docs/BTD_Mod_Helper.UI.Modded.RoundSetChanger.json diff --git a/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/README.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/README.json new file mode 100644 index 000000000..2272052de --- /dev/null +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/docs/README.json @@ -0,0 +1 @@ +{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BloonsTD6 Mod Helper Assembly

\n

Namespaces

\n

\n

BTD_Mod_Helper Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
BloonsModExpanded version of MelonMod to suit the needs of BTD Mod Helper
BloonsTD6ModExtend this Class instead of MelonMod to gain access to dozens of easy to use built-in hooks
ModHelperCatch-all class for non-extension static methods
\n

\n

BTD_Mod_Helper.Api Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
AnimationsClass to statically store RuntimeAnimationControllers for different animations
FontsClass to statically store TMP_FontAsset for different fonts
ModByteLoaderA class that can be generated by your mod in order to statically load a big complex Model object in your mod, like
Ninja Kiwi does with the whole GameModel
\">ModByteLoader<T>A class that can be generated by your mod in order to statically load a big complex Model object in your mod, like
Ninja Kiwi does with the whole GameModel
ModContentModContent serves two major purposes:


1. It is a base class for things that needs to be loaded via reflection from mods and given Ids,
such as ModTower and ModUpgrade


2. It is a utility class with methods to access instances of those classes and other resources
ModGameMenuClass for a custom BTD6 menu
\">ModGameMenu<T>Generic class for creating a ModGameMenu with the given type as it's base menu
ModLoadTaskClass for a Coroutine style task that runs during the BTD6 loading screen
ModMenuDataClass to be passed in to the Open methods of Screens
MoreAccessToolsFurther methods along the lines of Harmony's HarmonyLib.AccessTools
NamedModContentModContent with DisplayName and Description that registers values in the LocalizationManger's textTable
TaskSchedulerClass for scheduling Tasks using MelonCoroutines
\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Interfaces
IModContentDummy interface to unite ModContent and BloonsTD6Mod
\n

\n

BTD_Mod_Helper.Api.Bloons Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
BloonModelUtilsProvides Utility methods for dealing with BloonModels
ModBloonClass for adding in a new Bloon to the game
\">ModBloon<T>Class for a ModBloon which has a different ModBloon as its base
ModRoundSetClass for a custom RoundSet
ModVanillaBloonAllows you to easily modify the models of a specific vanilla Bloon
ModVanillaBloonsAllows you to easily modify the models of multiple vanilla Bloons
\n

\n

BTD_Mod_Helper.Api.Components Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
MatchLocalPositionComponent to make this transform continuously match the position of another transform
ModGameMenuTrackerComponent to track that a instance of a GameMenu's gameObject actually is the same ModGameMenu as was opened,
as direct comparison on the Unity Objects does not work reliably
ModHelperButtonModHelperComponent for a background panel
ModHelperCategoryModHelperComponent for a category in the mod settings menu
ModHelperCheckboxModHelperComponent for a Checkbox
ModHelperComponentBase for a helper component for making custom UIs in the same style as Vanilla ones
ModHelperComponentExtExtensions for mod helper components, for using generics and based on restricts for il2cpp objects
ModHelperDropdownModHelperComponent for a
ModHelperImageModHelperComponent for a
ModHelperInputFieldModHelperComponent for a text input field
ModHelperOptionModHelperComponent that's the base panel for the visual representation of a ModSetting
ModHelperPanelModHelperComponent for a background panel
ModHelperScrollPanelModHelperComponent for a background panel
ModHelperSliderModHelperComponent for a sliding input
ModHelperTextModHelperComponent for a background panel
ScaleOverrideCustom component to keep the scale of a transform permanently at 0, even if an Animator tries to change it
\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Structs
InfoStruct used to represent the name, position and size information of a ModHelperComponent
\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Enums
InfoPresetSpecific common preset setups of Info structs
\n

\n

BTD_Mod_Helper.Api.Coop Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
MessageUtilsUtility functions used for sending messages over the network.
\n

\n

BTD_Mod_Helper.Api.Data Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
ModMultiTextOverrideA bunch of ModTextOverrides that all share the same Active condition and don't require any on the fly determinations of
their text
ModSettingsAnother class outside of the main BloonsTD6Mod class that ModSettings can be defined in. Rules otherwise work the same
way
ModTextOverrideClass for dynamically overriding In-Game text in a way that's compatible with other mods
\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Interfaces
IModSettingsInterface to signify that BTD_Mod_Helper.Api.ModOptions.ModSettingsHandler.CreateModSettings(BTD_Mod_Helper.Api.Data.IModSettings,BTD_Mod_Helper.BloonsMod) should be called on this type
\n

\n

BTD_Mod_Helper.Api.Display Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
ModBloonCustomDisplayA ModCustomDisplay that will automatically apply to a ModBloon
\">ModBloonCustomDisplay<T>A ModCustomDisplay that will automatically apply to a ModBloon
ModBloonDisplayA ModDisplay that will automatically apply to a ModBloon
\">ModBloonDisplay<T>A convenient generic class for applying a ModBloonDisplay to a ModBloon
ModBuffIconClass for adding a new buff icon that can be displayed for towers
ModCustomDisplayThe custom version of a ModDisplay that loads in a model from a unity assetbundle
ModDisplayA custom Display that is a copy of an existing Display that can be modified
ModDisplay2DMod Display specifically set up to be a 2d image
ModTowerCustomDisplayA ModCustomDisplay that will automatically apply to a ModTower for specific tiers
\">ModTowerCustomDisplay<T>A convenient generic class for applying a ModTowerCustomDisplay to a ModTower
ModTowerDisplayA ModDisplay that will automatically apply to a ModTower for specific tiers
\">ModTowerDisplay<T>A convenient generic class for applying a ModTowerDisplay to a ModTower
\n

\n

BTD_Mod_Helper.Api.Enums Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
RoundSetTypeIn game IDs for the round sets included in BTD6
TowerSetTypeEnum-like class for the different tower set types
\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Enums
ScheduleTypeControls how you want to wait the Task Scheduler to wait for your tasks
\n

\n

BTD_Mod_Helper.Api.Helpers Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
AbilityHelperA wrapper around AbilityModels for making them easier to create
ActionHelperClass for converting actions and functions
AttackHelperA wrapper around AttackModels for making them easier to create
CostHelperHelper for scaling costs to difficulties
FileDialogHelperClass to help with the usage of Native File Dialogs
FileIOHelperClass replacing the original functionality of FileIOUtil before BTD6 update 33.0
GameModelExporterClass for handily exporting elements of the GameModel to json files
InstancesProvides quick access to many major BTD6 singleton classes
ListsProvides quick access to many major BTD6 object lists
LocalizationHelperHelps mods more easily support additional localization for their mod texts
MapHelperContains helper methods for working with maps and custom maps.
MatchScaleComponent to make this transform continuously match the scale of another transform
ModelHelperA wrapper class around a Model
\">ModelHelper<T>A wrapper class around a Model
ProcessHelperHelper methods for processes
ProjectileHelperA wrapper around ProjectileModels for making them easier to create
WeaponHelperA wrapper around WeaponModels for making them easier to create
\n

\n

BTD_Mod_Helper.Api.ModMenu Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
ModHelperHttpHttp client used by the mod helper
\n

\n

BTD_Mod_Helper.Api.ModOptions Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
ModSettingBase class for a ModSetting without the generics
\">ModSetting<T>Class for keeping track of a variable for a Mod that can be changed in game via the Mod Settings menu
ModSettingBoolModSetting class for a boolean value
ModSettingButtonModSetting for adding a button in the settings that performs a given action, with the setting just tracking
the number of times that the button has been pressed.
ModSettingCategoryCategory of mod settings
ModSettingDoubleModSetting for a decimal value
\">ModSettingEnum<T>ModSetting for an Enum value
ModSettingFileModSetting for selecting a specific file on the host computer
ModSettingFloatAlias for ModSettingDouble
ModSettingFolderModSetting for selecting a specific folder on the host computer
ModSettingHotkeyModSetting for a customizable Hotkey
ModSettingIntModSetting for int values
\">ModSettingNumber<T>ModSetting class for a number, implying it can have a min/max value, and be an input or a slider
ModSettingStringModSetting for a string value
\n

\n

BTD_Mod_Helper.Api.Scenarios Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
ModGameModeClass for a custom GameMode that will be added to the modes screen when starting a new match
\n

\n

BTD_Mod_Helper.Api.Towers Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
ModHeroClass for adding a custom Hero to the game. Use alongside ModHeroLevel to give multiple levels.
ModHeroLevelClass representing the UpgradeModel and changes for a particular Level for a ModHero
\">ModHeroLevel<T>Convenient generic class for specifying the ModHero that this ModHeroLevel is for
ModParagonUpgradeDefines the Paragon Upgrade for a ModTower. Remember to set the ParagonMode property.
\">ModParagonUpgrade<T>A convenient generic class for specifying the ModTower that this ModParagonUpgrade is for
ModSubTowerHelper class for making a subtower
\">ModSubTower<T>Helper class for making a subtower for a specific other ModTower
ModTowerClass for adding a custom Tower to the game. Use alongside ModUpgrade to define its upgrades,
and optionally ModTowerDisplay to define custom displays for it.
\">ModTower<T>A convenient generic class for specifying the ModTowerSet that a ModTower uses
ModTowerHelperClass with helper methods for TowerModels / ModTowers


Mostly used internally
ModTowerSetA custom collection of ModTowers
ModUpgradeA class used to create an Upgrade for a Tower
\">ModUpgrade<T>A convenient generic class for specifying the ModTower that this ModUpgrade is for
ModVanillaContentClass for changing Vanilla content within the game
\">ModVanillaContent<T>ModContent Class for modifying a certain set of vanilla towers
ModVanillaParagonDummy ModTower that can be used to make a Paragon for a base tower.
ModVanillaTowerModContent class for modifying all TowerModels for a given Tower
\">ModVanillaTower<T>Helper class for changing a vanilla tower to be part of a modded tower set
ModVanillaUpgradeModContent class for modifying all TowerModels that have a given upgrade applied to them
\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Enums
ParagonModeDefines the Paragon behavior for a ModTower
\n

\n

BTD_Mod_Helper.Extensions Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
AbilityModelBehaviorExtExtensions for AbilityModels
AbilityModelExtExtensions for AbilityModels
ActionExtExtension methods for System.Action
AddBehaviorToBloonModelExtExtensions for AddBehaviorToBloonModels
AirUnitModelBehaviorExtBehavior extensions for AirUnitModels
ArrayExtExtensions for arrays
AssemblyExtExtensions for Assemblies
AttackBehaviorExtBehavior extensions for attacks
AttackModelBehaviorExtBehavior Extensions for AttackModel
AttackModelExtExtensions for AttackModels
AudioClipExtensionsExtensions for unity audio clips
BloonBehaviorExtExtensions for getting bloon behaviors
BloonExtExtensions for Bloons
BloonModelBehaviorExtBehavior extensions for BloonModels
BloonModelExtExtensions for BloonModels
BloonsTD6ModExtExtensions for BloonsTD6Mods (for some reason lol)
BloonToSimulationExtExtensions for the BloonToSimulation
ButtonClickedEventExtExtensions for ButtonClickedEvents
ButtonExtExtensions for Buttons
ComponentExtExtensions for Component
DeconstructExtAdding more deconstruct methods to things
DictionaryExtExtensions for normal System Dictionaries
DirectoryInfoExtExtensions for DirectoryInfo
DisplayModelExtExtensions for DisplayModel
DumpNodeExtExtension for dumping textures from UnityDisplayNodes
EmissionModelBehaviorExtExtensions for EmissionModels
EntityBehaviorExtBehavior extensions for Entities
EntityExtExtensions for Entities
FileInfoExtExtensions for FileInfo
FunctionExtExtensions for Functions
GameExtExtensions for Game
GameModelExtExtensions for the GameModel
GameObjectExtExtensions for GameObjects
GrowModelExtExtension methods for Il2CppAssets.Scripts.Models.Bloons.Behaviors.GrowModel.
HarmonyExtExtensions for Harmony stuff
IEnumerableExtExtensions for the normal System IEnumerable class
Il2CppGenericIEnumerableExtensions for Il2cpp Ienumerables
Il2CppGenericIEnumerableExtExtensions for il2cpp ienumerables
Il2CppGenericsExtensions for il2cpp lists
Il2CppGenericsExtExtensions for generic il2cpp lists
Il2CppIEnumeratorExtensions for il2cpp ienumerators
Il2CppIEnumeratorExtExtensions for Il2cpp Ienumerators
Il2CppReferenceArrayExtensions for il2cpp reference arrays
Il2CppReferenceArrayExtExtensions for Il2CppReferenceArrays
Il2CppStringArrayExtExtension methods for Il2CppStringArrays
Il2CppSystemDelegateExxtExtensions for Il2cpp delegates
Il2CppSystemDictionaryExtExtensions for il2cpp dictionaries
Il2CppSystemObjectExtExtensions for Il2cpp objects
ImageExtExtensions for Images
InGameExtExtensions for the InGame class
InputFieldExtExtensions for InputFields
InputFieldOnValueChangedExtension for OnChangeEvent
InputFieldSubmitEventExtensions for InputFieldSubmitEvents
LayoutGroupExtExtensions for LayoutGroups
ListExtExtensions for non il2cpp Lists
LocalizationManagerExtExtension methods for the Localization Manager.
LockedListExtensions for LockedLists
LockedListExtExtensions for LockLists
MapExtExtensions for Maps
MiscModelExtOther miscellaneous extensions for various Model classes
ModelExtExtensions for Models
ModModelExtExtensions for the ModModel (GameMode) class
NK_TextMeshProUGUIExtExtensions for NK_TextMeshProUGuis
NKMultiGameInterfaceExtExtensions for sending and receiving data in coop
PetModelBehaviorExtExtensions for PetModels
PopupScreenExtExtensions for PopupScreen
PowerModelBehaviorExtBehavior extensions for PowerModels
ProfileModelExtExtensions for ProfileModels
ProjectileBehaviorExtBehavior extensions for projectiles
ProjectileExtExtensions for Projectiles
ProjectileModelBehaviorExtBehavior Extensions for ProjectileModels
ProjectileModelExtExtensions for ProjectileModels
RendererExtExtensions for unity renderers
RootObjectLockListExtensions for RootObjectLockLists
RoundModelExtExtensions for RoundModels
SelectableObjectExtExtensions for Selectable Objects
SliderEventExtExtensions for SliderEvents
SpawnerExtExtensions for Spawners
SpriteExtExtensions for Sprites
SpriteReferenceExtExtensions for SpriteReferences
StandardTowerPurchaseButtonExtExtensions for StandardTowerPurchaseButtons
StreamExtExtensions for streams
StringExtExtensions for strings
SupportModelExtExtension methods for support models
Texture2DExtExtensions for Texture2Ds
ToggleEventExtExtensions for ToggleEvents
ToggleExtExtensions for Toggles
TowerBehaviorExtBehavior extensions for Towers
TowerDetailsModelExtExtensions for TowerDetailsModels
TowerExtExtensions for Towers
TowerModelBehaviorExtBehavior extensions for TowerModels
TowerModelExtExtensions for TowerModels
TowerToSimulationExtExtensions for TowerToSimulation
TypeExtExtensions for Type
UnityDisplayNodeExtExtensions for UnityDisplayNodes
UpgradeModelExtExtensions for UpgradeModels
Vector3ExtExtensions for Vectors
WeaponBehaviorExtBehavior extensions for Weapons
WeaponModelBehaviorExtBehavior extensions for WeaponModels
WeaponModelExtExtensions for WeaponModels
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Delegates
Function()
()\">Function<T>()
InputFieldOnValueChanged.Function(string)Represents a multicast delegate; that is, a delegate that can have more than one element in its invocation list.
InputFieldSubmitEvent.Function(string)Represents a multicast delegate; that is, a delegate that can have more than one element in its invocation list.
SliderEventExt.Function(float)Represents a multicast delegate; that is, a delegate that can have more than one element in its invocation list.
ToggleEventExt.Function(bool)Represents a multicast delegate; that is, a delegate that can have more than one element in its invocation list.
\n

\n

BTD_Mod_Helper.UI.BTD6 Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
MainMenuUIClass to access the game's Main Menu UI
MapSelectUIClass to access the game's Map Select UI
TitleScreenUIClass to access the Title Screen UI
\n

\n

BTD_Mod_Helper.UI.Menus Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
ModSettingsMenuThe ModGameMenu for Mod Settings
\n

\n

BTD_Mod_Helper.UI.Modded Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
RoundSetChangerClass controlling the in game Round Set override UI
","tableOfContentsHtml":"","title":"README"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/index.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/index.json similarity index 100% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/index.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/index.json diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Appearing-in-the-Mod-Browser.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Appearing-in-the-Mod-Browser.json similarity index 86% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Appearing-in-the-Mod-Browser.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Appearing-in-the-Mod-Browser.json index 77ae5b03d..500d80ca6 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Appearing-in-the-Mod-Browser.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Appearing-in-the-Mod-Browser.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

Disclaimers

\n

There will be a 0 strike policy for inappropriate content on the Mod Browser. This includes but is not limited to:

\n\n

This is the Monkey vs Balloon game we're talking about here people

\n

An unverified modder that posts this content will have their GitHub account blacklisted. A verified modder will lose their verification status and possibly get blacklisted depending on severity.

\n

If too many violations occur to be reasonably dealt with, the option for users to see unverified content at all will be removed.

\n

Requirements

\n

Showing up in the Mod Browser requires two major things on your end, and one thing on the user's end

\n\n

For it to be a valid ModHelperData file, it must either:

\n
    \n
  1. Be ModHelperData.json a json file (optionally embedded in your project) that defined the ModHelperData fields in a standard one level json object like
  2. \n
\n
{\n    \"Name\": \"Template Mod\",\n    \"Description\": \"An empty mod\",\n    // ...\n}\n
\n
    \n
  1. Be ModHelperData.cs, a source code file you compile with your mod that defines the ModHelperData fields as consts like
  2. \n
\n
namespace TemplateMod;\n\npublic static class ModHelperData\n{\n    public const string Name = \"Template Mod\";\n    public const string Description = \"An empty mod\";\n    ...\n}\n
\n
    \n
  1. Be ModHelperData.txt, using the same parsing as *.cs but not pretending to be a source code file if you're not using it as one. You can even simplify the fields to be like
  2. \n
\n
Name = \"Template Mod\"\nDescription = \"An empty mod\"\n...\n
\n
Regex Parsings for *.cs and *.txt if you want to manually check\n
SemVerRegex = \"(?:\\\\d+)(?>\\\\.(?:\\\\d+))?(?>\\\\.(?:\\\\d+))?(?>\\\\-(?:[0-9A-Za-z\\\\-\\\\.]+))?(?>\\\\+(?:[0-9A-Za-z\\\\-\\\\.]+))?\";\nVersionRegex = \"\\\\bVersion\\\\s*=\\\\s*\\\"(\" + SemVerRegex + \")\\\";?[\\n\\r]+\";\nNameRegex = \"\\\\bName\\\\s*=\\\\s*\\\"(.+)\\\";?[\\n\\r]+\";\nDescRegex = \"\\\\bDescription\\\\s*=(?:[\\\\s+]*\\\"(.+)\\\")+;?[\\n\\r]+\";\nIconRegex = \"\\\\bIcon\\\\s*=\\\\s*\\\"(.+\\\\.png)\\\";?[\\n\\r]+\";\nDllRegex = \"\\\\bDllName\\\\s*=\\\\s*\\\"(.+\\\\.dll)\\\";?[\\n\\r]+\";\nRepoNameRegex = \"\\\\bRepoName\\\\s*=\\\\s*\\\"(.+)\\\";?[\\n\\r]+\";\nRepoOwnerRegex = \"\\\\bRepoOwner\\\\s*=\\\\s*\\\"(.+)\\\";?[\\n\\r]+\";\nManualDownloadRegex = \"\\\\bManualDownload\\\\s*=\\\\s*(false|true);?[\\n\\r]+\";\nZipRegex = \"\\\\bZipName\\\\s*=\\\\s*\\\"(.+)\\\\.zip\\\";?[\\n\\r]+\";\nAuthorRegex = \"\\\\bAuthor\\\\s*=\\\\s*\\\"(.+)\\\";?[\\n\\r]+\";\nSubPathRegex = \"\\\\bSubPath\\\\s*=\\\\s*\\\"(.+)\\\";?[\\n\\r]+\";\n
\n
\n

If you do use the *.cs way, you can also then directly use the values in your MelonInfoAttribute, so you only have to keep track of them in one place

\n
[assembly: MelonInfo(typeof(YourMod), ModHelperData.Name, ModHelperData.Version, ModHelperData.RepoOwner)]\n
\n

ModHelperData fields

\n

Required

\n

Name (string): The displayed name of your mod, as you'd like it to appear in screens like the Mod Menu and Mod Browser

\n

Version (string): The current version of your mod. Must follow proper semantic versioning guidelines for updating to work.

\n

RepoName (string) and RepoOwner (string): Must match the GitHub repo that your hosting the mod at, and are used in game to determine mod updates through the GitHub API.

\n

WorksOnVersion (string): As of BTD6 v34 and the switch to MelonLoader 6.0, a string value is required here that's semantically at/above \"34\" to signify that your mod is compatible with the latest versions of the game. Usage of this field may expand in the future, so it's recommended to keep it relatively up to date it alongside your ModHelperData.

\n

Optional

\n

Description (string): The description of your mod. If not included, the GitHub repo's description will be used.

\n

Icon (string): Icon to use for your mod, including the file extension and any /s needed to find the icon from the top level of your repository. File must be under .5 MB. If not set, will check for \"Icon.png\" at the top level of the repository.

\n

DllName (string): If your .dll file is a different name than your Assembly name, include that information here (extension included).

\n

Author (string): If you want something different to show up as the Author of your mod than the RepoOwner, define that here.

\n

ManualDownload (bool): If your release asset to be downloaded through users' browser rather than trying to download the release asset in game.

\n

ZipName (string): If you want to upload your mod DLL inside a zip file, specify the correct name of the zip file (extension included) here. NOTE: If you do not include a DllName to look for inside the zip, it will override to being ManualDownload. If you have multiple files / folders needing to be downloaded in your Zip, it will need to be a ManualDownload one way or another based on current Mod Helper capability.

\n

SquareIcon (bool): Makes your icon draw as constrained within panels rather than being allowed to slightly overflow.

\n

SubPath (string): See Experimental: MonoRepo support below

\n

Dependencies (string): Comma separated list of strings for what other dependencies from the Mod Browser this mod has (other than Mod Helper). Reference mods using the \"owner/repository\" format, using the GitHub owner name (not the mod's display Author) and the GitHub repository name (not the mod's display name). Example: \"doombubbles/paths-plus-plus\" or \"doombubbles/paths-plus-plus,doombubbles/ultimate-crosspathing\"

\n

Updating

\n

If an installed mod has ModHelperData.cs in their code or ModHelperData.json / ModHelperData.txt` included as an embedded resource, it will be used to populate that mods information in the Mods Screen.

\n

If it has both a valid RepoOwner and RepoName, it will check the mod's current version against the version specified in that Repo's ModHelperData. If it's an update, this will be indicated to the user and they will then have the option to fetch the latest GitHub release for the repository. The title and message of this release will be shown to the user and, if they accept, they'll download the release artifact specified by DllName or ZipName or just the first dll file included.

\n

Users will be warned if the Tag used for release does not match the version you specified. This may happen during the hopefully brief window of time between you making the commit that edits your ModHelperData and the release of your new version.

\n

Experimental: Monorepo support

\n

Many modders have ended up making a ton of mods and host all of them within one GitHub repository. I, doombubbles, did this myself to start out with and have since regretted it, as I was just doing it to mimic what others were doing and I no longer think the monorepo structure makes sense all things considered for multiple independent mods. Still, I wanted to add rudimentary support for existing monorepos, even though I myself am migrating my mods out of one.

\n

To set up a Mono Repo:

\n\n

All the ModHelperData files must then:

\n\n

See here for an example of both methods at once

\n

Instead of showing users the latest release message when downloading a new version, it will show the commit message of the most recent commit which changed the DLL file.

\n

The GitHub stars that a monorepo has will be split among the mods it holds, with a \"+\" indicator afterward in the Mod Browser. No, this isn't fully fair, but neither is giving all the mods all of the stars, and at this point I'd rather incentivize separate repos over monorepos.

","tableOfContentsHtml":"","title":"Appearing in the Mod Browser"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

Disclaimers

\n

There will be a 0 strike policy for inappropriate content on the Mod Browser. This includes but is not limited to:

\n\n

This is the Monkey vs Balloon game we're talking about here people

\n

An unverified modder that posts this content will have their GitHub account blacklisted. A verified modder will lose their verification status and possibly get blacklisted depending on severity.

\n

If too many violations occur to be reasonably dealt with, the option for users to see unverified content at all will be removed.

\n

Requirements

\n

Showing up in the Mod Browser requires two major things on your end, and one thing on the user's end

\n\n

For it to be a valid ModHelperData file, it must either:

\n
    \n
  1. Be ModHelperData.json a json file (optionally embedded in your project) that defined the ModHelperData fields in a standard one level json object like
  2. \n
\n
{\n    \"Name\": \"Template Mod\",\n    \"Description\": \"An empty mod\",\n    // ...\n}\n
\n
    \n
  1. Be ModHelperData.cs, a source code file you compile with your mod that defines the ModHelperData fields as consts like
  2. \n
\n
namespace TemplateMod;\n\npublic static class ModHelperData\n{\n    public const string Name = \"Template Mod\";\n    public const string Description = \"An empty mod\";\n    ...\n}\n
\n
    \n
  1. Be ModHelperData.txt, using the same parsing as *.cs but not pretending to be a source code file if you're not using it as one. You can even simplify the fields to be like
  2. \n
\n
Name = \"Template Mod\"\nDescription = \"An empty mod\"\n...\n
\n
Regex Parsings for *.cs and *.txt if you want to manually check\n
SemVerRegex = \"(?:\\\\d+)(?>\\\\.(?:\\\\d+))?(?>\\\\.(?:\\\\d+))?(?>\\\\-(?:[0-9A-Za-z\\\\-\\\\.]+))?(?>\\\\+(?:[0-9A-Za-z\\\\-\\\\.]+))?\";\nVersionRegex = \"\\\\bVersion\\\\s*=\\\\s*\\\"(\" + SemVerRegex + \")\\\";?[\\n\\r]+\";\nNameRegex = \"\\\\bName\\\\s*=\\\\s*\\\"(.+)\\\";?[\\n\\r]+\";\nDescRegex = \"\\\\bDescription\\\\s*=(?:[\\\\s+]*\\\"(.+)\\\")+;?[\\n\\r]+\";\nIconRegex = \"\\\\bIcon\\\\s*=\\\\s*\\\"(.+\\\\.png)\\\";?[\\n\\r]+\";\nDllRegex = \"\\\\bDllName\\\\s*=\\\\s*\\\"(.+\\\\.dll)\\\";?[\\n\\r]+\";\nRepoNameRegex = \"\\\\bRepoName\\\\s*=\\\\s*\\\"(.+)\\\";?[\\n\\r]+\";\nRepoOwnerRegex = \"\\\\bRepoOwner\\\\s*=\\\\s*\\\"(.+)\\\";?[\\n\\r]+\";\nManualDownloadRegex = \"\\\\bManualDownload\\\\s*=\\\\s*(false|true);?[\\n\\r]+\";\nZipRegex = \"\\\\bZipName\\\\s*=\\\\s*\\\"(.+)\\\\.zip\\\";?[\\n\\r]+\";\nAuthorRegex = \"\\\\bAuthor\\\\s*=\\\\s*\\\"(.+)\\\";?[\\n\\r]+\";\nSubPathRegex = \"\\\\bSubPath\\\\s*=\\\\s*\\\"(.+)\\\";?[\\n\\r]+\";\n
\n
\n

If you do use the *.cs way, you can also then directly use the values in your MelonInfoAttribute, so you only have to keep track of them in one place

\n
[assembly: MelonInfo(typeof(YourMod), ModHelperData.Name, ModHelperData.Version, ModHelperData.RepoOwner)]\n
\n

ModHelperData fields

\n

Required

\n

Name (string): The displayed name of your mod, as you'd like it to appear in screens like the Mod Menu and Mod Browser

\n

Version (string): The current version of your mod. Must follow proper semantic versioning guidelines for updating to work.

\n

RepoName (string) and RepoOwner (string): Must match the GitHub repo that your hosting the mod at, and are used in game to determine mod updates through the GitHub API.

\n

WorksOnVersion (string): As of BTD6 v34 and the switch to MelonLoader 6.0, a string value is required here that's semantically at/above \"34\" to signify that your mod is compatible with the latest versions of the game. Usage of this field may expand in the future, so it's recommended to keep it relatively up to date it alongside your ModHelperData.

\n

Optional

\n

Description (string): The description of your mod. If not included, the GitHub repo's description will be used.

\n

Icon (string): Icon to use for your mod, including the file extension and any /s needed to find the icon from the top level of your repository. File must be under .5 MB. If not set, will check for \"Icon.png\" at the top level of the repository.

\n

DllName (string): If your .dll file is a different name than your Assembly name, include that information here (extension included).

\n

Author (string): If you want something different to show up as the Author of your mod than the RepoOwner, define that here.

\n

ManualDownload (bool): If your release asset to be downloaded through users' browser rather than trying to download the release asset in game.

\n

ZipName (string): If you want to upload your mod DLL inside a zip file, specify the correct name of the zip file (extension included) here. NOTE: If you do not include a DllName to look for inside the zip, it will override to being ManualDownload. If you have multiple files / folders needing to be downloaded in your Zip, it will need to be a ManualDownload one way or another based on current Mod Helper capability.

\n

SquareIcon (bool): Makes your icon draw as constrained within panels rather than being allowed to slightly overflow.

\n

SubPath (string): See Experimental: MonoRepo support below

\n

Dependencies (string): Comma separated list of strings for what other dependencies from the Mod Browser this mod has (other than Mod Helper). Reference mods using the \"owner/repository\" format, using the GitHub owner name (not the mod's display Author) and the GitHub repository name (not the mod's display name). Example: \"doombubbles/paths-plus-plus\" or \"doombubbles/paths-plus-plus,doombubbles/ultimate-crosspathing\"

\n

Updating

\n

If an installed mod has ModHelperData.cs in their code or ModHelperData.json / ModHelperData.txt` included as an embedded resource, it will be used to populate that mods information in the Mods Screen.

\n

If it has both a valid RepoOwner and RepoName, it will check the mod's current version against the version specified in that Repo's ModHelperData. If it's an update, this will be indicated to the user and they will then have the option to fetch the latest GitHub release for the repository. The title and message of this release will be shown to the user and, if they accept, they'll download the release artifact specified by DllName or ZipName or just the first dll file included.

\n

Users will be warned if the Tag used for release does not match the version you specified. This may happen during the hopefully brief window of time between you making the commit that edits your ModHelperData and the release of your new version.

\n

Experimental: Monorepo support

\n

Many modders have ended up making a ton of mods and host all of them within one GitHub repository. I, doombubbles, did this myself to start out with and have since regretted it, as I was just doing it to mimic what others were doing and I no longer think the monorepo structure makes sense all things considered for multiple independent mods. Still, I wanted to add rudimentary support for existing monorepos, even though I myself am migrating my mods out of one.

\n

To set up a Mono Repo:

\n\n

All the ModHelperData files must then:

\n\n

See here for an example of both methods at once

\n

Instead of showing users the latest release message when downloading a new version, it will show the commit message of the most recent commit which changed the DLL file.

\n

The GitHub stars that a monorepo has will be split among the mods it holds, with a \"+\" indicator afterward in the Mod Browser. No, this isn't fully fair, but neither is giving all the mods all of the stars, and at this point I'd rather incentivize separate repos over monorepos.

","tableOfContentsHtml":"","title":"Appearing in the Mod Browser"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Array-extension-methods.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Array-extension-methods.json similarity index 76% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Array-extension-methods.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Array-extension-methods.json index 957435ae6..08762138a 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Array-extension-methods.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Array-extension-methods.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

Array Extension methods

\n

Conversion

\n

When modding and dealing with Ninja Kiwi's code, it is often frustrating having to convert/read/edit all sorts of different Array/List-like things

\n

Here are all the types of lists/arrays supported

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
type of array/listmethod
System.List<T>.ToList<T>()
Il2CppSystem.List<T>.ToIl2CppList<T>()
Assets.Scripts.Utils.LockList<T>.ToLockList<T>()
Assets.Scripts.Utils.SizedList<T>.ToSizedList<T>()
Il2CppReferenceArray<T>.ToIl2CppReferenceArray<T>()
\n

they can all be seamlessly converted to one another

\n

e.g.

\n
System.List<AbilityModel> list = new System.List<AbilityModel>();\nIl2CppReferenceArray<AbilityModel> a = list.ToIl2CppReferenceArray<AbilityModel>();\n
\n

Other

\n

The Mod helper also contains other methods for dealing with them

\n

let arr denote the relevant Array/List, e.g. LockList<BloonModel> or Il2CppReferenceArray<AbilityModel>with type TSource or T, and obj an Il2CppSystem.Object of type TCast

\n

remove arr if you are doing it like this

\n
// e.g. instead of\nvar dup =RelevantExtClass.Duplicate(arr);\n// do\nvar dup = arr.Duplicate<T>()\n
\n

The above will be true for the rest of this page

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
methodexplanation
AddTo<TSource, TCast>(arr, obj)attempts to cast obj into relevant type and add it to arr
Duplicate<T>(arr)duplicates the arr
DuplicateAs<TSource, TCast>(arr)returns a new arr where every item inside will be attempted to be casted to whatever TCast is
GetItemOfType<TSource, TCast>(arr)returns the first item of arr that can be casted to TCast
GetItemsOfType<TSource, TCast>(arr)returns the every item of arr that can be casted to TCast in an arr
HasItemsOfType<TSource, TCast>(arr)returns whether arr has an object that can be casted to TCast
RemoveItem<TSource, TCast>(arr, obj)returns an arr where one item is equal to obj is removed
RemoveItemOfType<TSource, TCast>(arr)returns an arr where one item which can be type-casted to TCast is removed
RemoveItemsOfType<TSource, TCast>(arr)returns an arr where every item which can be type-casted to TCast is removed
\n

IEnumerable

\n

(System.Collections.Generic)

\n

The extension methods for this only allows for the following functions:

\n\n

Conversion:

\n\n

There is also an ArgMax<T, K> function

\n
public static T ArgMax<T, K>(this IEnumerable<T> source, Func<T, K> map, IComparer<K> comparer = null){\n    //...\n}\n
\n

So you can put it simply

\n
var itemWithMaxPropValue = collection.ArgMax(x => x.Property);\n
\n

Il2CppGenericIEnumerable

\n

(Il2CppSystem.Collections.Generic)

\n

The extension methods for this only allows for the following conversions:

\n\n

as well as other methods

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
methoddescription
Count<T>(arr)Get the total number of elements
GetItem<T>(arr, int index)Return the Item at a specific index
GetEnumeratorCollections<T>(arr)Get the IEnumerator as type Il2CppSystem.Collections.IEnumerator
\n

Il2CppGenericIEnumerator

\n

(Il2CppSystem.Collections)

\n

eaxctly the same methods as Il2CppGenericIEnumerable without GetEnumeratorCollections<T>(arr)

","tableOfContentsHtml":"","title":"Array extension methods"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

Array Extension methods

\n

Conversion

\n

When modding and dealing with Ninja Kiwi's code, it is often frustrating having to convert/read/edit all sorts of different Array/List-like things

\n

Here are all the types of lists/arrays supported

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
type of array/listmethod
System.List<T>.ToList<T>()
Il2CppSystem.List<T>.ToIl2CppList<T>()
Assets.Scripts.Utils.LockList<T>.ToLockList<T>()
Assets.Scripts.Utils.SizedList<T>.ToSizedList<T>()
Il2CppReferenceArray<T>.ToIl2CppReferenceArray<T>()
\n

they can all be seamlessly converted to one another

\n

e.g.

\n
System.List<AbilityModel> list = new System.List<AbilityModel>();\nIl2CppReferenceArray<AbilityModel> a = list.ToIl2CppReferenceArray<AbilityModel>();\n
\n

Other

\n

The Mod helper also contains other methods for dealing with them

\n

let arr denote the relevant Array/List, e.g. LockList<BloonModel> or Il2CppReferenceArray<AbilityModel>with type TSource or T, and obj an Il2CppSystem.Object of type TCast

\n

remove arr if you are doing it like this

\n
// e.g. instead of\nvar dup =RelevantExtClass.Duplicate(arr);\n// do\nvar dup = arr.Duplicate<T>()\n
\n

The above will be true for the rest of this page

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
methodexplanation
AddTo<TSource, TCast>(arr, obj)attempts to cast obj into relevant type and add it to arr
Duplicate<T>(arr)duplicates the arr
DuplicateAs<TSource, TCast>(arr)returns a new arr where every item inside will be attempted to be casted to whatever TCast is
GetItemOfType<TSource, TCast>(arr)returns the first item of arr that can be casted to TCast
GetItemsOfType<TSource, TCast>(arr)returns the every item of arr that can be casted to TCast in an arr
HasItemsOfType<TSource, TCast>(arr)returns whether arr has an object that can be casted to TCast
RemoveItem<TSource, TCast>(arr, obj)returns an arr where one item is equal to obj is removed
RemoveItemOfType<TSource, TCast>(arr)returns an arr where one item which can be type-casted to TCast is removed
RemoveItemsOfType<TSource, TCast>(arr)returns an arr where every item which can be type-casted to TCast is removed
\n

IEnumerable

\n

(System.Collections.Generic)

\n

The extension methods for this only allows for the following functions:

\n\n

Conversion:

\n\n

There is also an ArgMax<T, K> function

\n
public static T ArgMax<T, K>(this IEnumerable<T> source, Func<T, K> map, IComparer<K> comparer = null){\n    //...\n}\n
\n

So you can put it simply

\n
var itemWithMaxPropValue = collection.ArgMax(x => x.Property);\n
\n

Il2CppGenericIEnumerable

\n

(Il2CppSystem.Collections.Generic)

\n

The extension methods for this only allows for the following conversions:

\n\n

as well as other methods

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
methoddescription
Count<T>(arr)Get the total number of elements
GetItem<T>(arr, int index)Return the Item at a specific index
GetEnumeratorCollections<T>(arr)Get the IEnumerator as type Il2CppSystem.Collections.IEnumerator
\n

Il2CppGenericIEnumerator

\n

(Il2CppSystem.Collections)

\n

eaxctly the same methods as Il2CppGenericIEnumerable without GetEnumeratorCollections<T>(arr)

","tableOfContentsHtml":"","title":"Array extension methods"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/BTD6-Internal-Structure.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/BTD6-Internal-Structure.json similarity index 69% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/BTD6-Internal-Structure.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/BTD6-Internal-Structure.json index 32e68b653..1dde45ccb 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/BTD6-Internal-Structure.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/BTD6-Internal-Structure.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

Some useful information about the internal structure of BTD6 so that you don't have to find it out yourself.

\n

Game.instance

\n

From any of your .cs files, you can use Game.instance to access the BloonTD6 Game. This class contains many important references to the data structures that power the overall running of the game.

\n

The GameModel

\n

Arguably the most important thing you'll find in Game.instance is Game.instance.model which is the main instance of the BloonsTD6 GameModel (but importantly not the only one). The GameModel isn't a model like a 3D display model, but rather a blueprint / collection of blueprints for playing a match of BloonsTD6.

\n

For instance, for all the information about Towers, such as their behavior, cost, damage, etc are all held in TowerModels that you can find in Game.instance.model.towers. The GameModel contains various methods for finding TowerModels such as GetTower() and GetTowerFromId().

\n

Similarly all the information about upgrades are stored in the UpgradeModels of Game.instance.model.upgrades, all the Bloons in BloonModels of Game.instance.model.bloons and etc.

\n

InGame.instance

\n

Similarly to Game.instance, you can use InGame.instance in any of your .cs files to access the InGame class which has a lot of important information and functions relating to running the current match of BTD6.

\n

UnityToSimulation (aka the \"bridge\")

\n

The UnityToSimulation class found at InGame.instance.bridge controls the interaction between the simulation (all of the information about the current state) and Unity (the engine powering the visualization of the game. This has more methods for handling / manipulating current match information, so if you didn't find what you were looking for in InGame.instance, this is another good place to look.

\n

Also in this class InGame.instance.bridge.Model or (InGame.instance.GetGameModel() with our extension method) is another GameModel class. Read more to see why this is.

\n

Cloned GameModels

\n

The GameModel that can be found at Game.instance.model is in a pure / default state, effectively. It has all the TowerModels unmodified by Monkey Knowledge, all at their Medium difficulty price, etc.

\n

When starting a new match of BTD6, the game makes a clone of this base GameModel, and then applies all the necessary modifications to it (the things that are referred to as \"mods\" in the source code). This includes things like Monkey Knowledge, Difficulty based pricing, CHIMPS rules, and more.

\n

Thus, when making a mod, you as a modder need to decide which GameModel would be better to modify.

\n

You can use the OnGameModelLoaded() hook in your BloonsTD6Mod file to change the core GameModel if you're doing something very important. This is dangerous, however, because other mods could implicitly rely on certain default functionality of the core GameModel.

\n

The alternative is to use the OnNewGameModel() hook to modify the newly cloned GameModel whenever a match starts. This has the benefit of being safer with respect to other mods, as well as being able to interact with Monkey Knowledge and such. If you only sometimes want to make a change to the GameModel, this is definitely the way to go. Additionally, if we as a modding community ever want to get to the point where we can load and unload mods without restarting the game, this is the way we have to change the GameModel.

","tableOfContentsHtml":"","title":"BTD6 Internal Structure"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

Some useful information about the internal structure of BTD6 so that you don't have to find it out yourself.

\n

Game.instance

\n

From any of your .cs files, you can use Game.instance to access the BloonTD6 Game. This class contains many important references to the data structures that power the overall running of the game.

\n

The GameModel

\n

Arguably the most important thing you'll find in Game.instance is Game.instance.model which is the main instance of the BloonsTD6 GameModel (but importantly not the only one). The GameModel isn't a model like a 3D display model, but rather a blueprint / collection of blueprints for playing a match of BloonsTD6.

\n

For instance, for all the information about Towers, such as their behavior, cost, damage, etc are all held in TowerModels that you can find in Game.instance.model.towers. The GameModel contains various methods for finding TowerModels such as GetTower() and GetTowerFromId().

\n

Similarly all the information about upgrades are stored in the UpgradeModels of Game.instance.model.upgrades, all the Bloons in BloonModels of Game.instance.model.bloons and etc.

\n

InGame.instance

\n

Similarly to Game.instance, you can use InGame.instance in any of your .cs files to access the InGame class which has a lot of important information and functions relating to running the current match of BTD6.

\n

UnityToSimulation (aka the \"bridge\")

\n

The UnityToSimulation class found at InGame.instance.bridge controls the interaction between the simulation (all of the information about the current state) and Unity (the engine powering the visualization of the game. This has more methods for handling / manipulating current match information, so if you didn't find what you were looking for in InGame.instance, this is another good place to look.

\n

Also in this class InGame.instance.bridge.Model or (InGame.instance.GetGameModel() with our extension method) is another GameModel class. Read more to see why this is.

\n

Cloned GameModels

\n

The GameModel that can be found at Game.instance.model is in a pure / default state, effectively. It has all the TowerModels unmodified by Monkey Knowledge, all at their Medium difficulty price, etc.

\n

When starting a new match of BTD6, the game makes a clone of this base GameModel, and then applies all the necessary modifications to it (the things that are referred to as \"mods\" in the source code). This includes things like Monkey Knowledge, Difficulty based pricing, CHIMPS rules, and more.

\n

Thus, when making a mod, you as a modder need to decide which GameModel would be better to modify.

\n

You can use the OnGameModelLoaded() hook in your BloonsTD6Mod file to change the core GameModel if you're doing something very important. This is dangerous, however, because other mods could implicitly rely on certain default functionality of the core GameModel.

\n

The alternative is to use the OnNewGameModel() hook to modify the newly cloned GameModel whenever a match starts. This has the benefit of being safer with respect to other mods, as well as being able to interact with Monkey Knowledge and such. If you only sometimes want to make a change to the GameModel, this is definitely the way to go. Additionally, if we as a modding community ever want to get to the point where we can load and unload mods without restarting the game, this is the way we have to change the GameModel.

","tableOfContentsHtml":"","title":"BTD6 Internal Structure"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Common-Extension-Methods.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Common-Extension-Methods.json similarity index 54% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Common-Extension-Methods.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Common-Extension-Methods.json index 63a9fa87f..367b8c2f7 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Common-Extension-Methods.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Common-Extension-Methods.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

The Mod Helper contains hundreds of Extension Methods to various BTD classes to help make modding easier and faster. Here are the ones that are most important for you to know about.

\n

Dealing with Models and Behaviors

\n

GetBehavior<T>() is present on nearly all Models and Behaviors, and its use is to get the first behavior of the specified type T within the object you're calling it from.

\n

GetBehaviors<T>() is the same, but it returns all the behaviors of that type and not just the first one.

\n

AddBehavior() and RemoveBehavior() perform pretty obvious but useful functions.

\n

Dealing with Custom Displays

\n

ApplyDisplay<T>() is present on TowerModels, ProjectileModels and DisplayModels and can be used to directly apply your Custom Display with type T to the given model.

\n

Arrays

\n

see Array Extension Methods

","tableOfContentsHtml":"","title":"Common Extension Methods"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

The Mod Helper contains hundreds of Extension Methods to various BTD classes to help make modding easier and faster. Here are the ones that are most important for you to know about.

\n

Dealing with Models and Behaviors

\n

GetBehavior<T>() is present on nearly all Models and Behaviors, and its use is to get the first behavior of the specified type T within the object you're calling it from.

\n

GetBehaviors<T>() is the same, but it returns all the behaviors of that type and not just the first one.

\n

AddBehavior() and RemoveBehavior() perform pretty obvious but useful functions.

\n

Dealing with Custom Displays

\n

ApplyDisplay<T>() is present on TowerModels, ProjectileModels and DisplayModels and can be used to directly apply your Custom Display with type T to the given model.

\n

Arrays

\n

see Array Extension Methods

","tableOfContentsHtml":"","title":"Common Extension Methods"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Custom-Byte-Loaders.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Custom-Byte-Loaders.json similarity index 57% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Custom-Byte-Loaders.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Custom-Byte-Loaders.json index ba6128dad..e7def00cd 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Custom-Byte-Loaders.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Custom-Byte-Loaders.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

Certain mods that generate a lot of new TowerModels or other GameModel information (e.g. such as Ultimate Crosspathing) would rather generate all taht information once, export it, and load it each time the game starts rather than generating it new each time. This is where ModByteLoaders come in. They wrap the native BloonsTD6 FlatFileCodeGen system that the game itself uses to save and load the actual GameModel.

\n

ModByteLoader

\n

Unlike every other Mod____ class, you don't just go create ModByteLoaders from scratch. Instead, you use the ModByteLoader.Generate method dynamically while your Mod is running and it will generate the file for you, along with a .bytes file for you to include in your project for it to load from.

\n

Arguments

\n

T model The il2cpp model that you want to save. NO non-il2cpp types work here.

\n

string loaderFilePath The absolute path in your file system to generate the loader .cs file to

\n

string bytesFilePath The absolute path in your file system to generate the data .bytes file to

\n

For the two path properties, it's recommended to make use of the standardized Mod Sources folder location by doing

\n
Path.Combine(ModContent.GetInstance<YourModName>().ModSourcesPath, \"Relative\", \"Path\", \"Loader.cs\")\n
\n

Limitations

\n

Directly importing and exporting types like lists and arrays has proved buggy. To save and load multiple things at once, Ultimate Crosspathing simply creates a dummy TowerModel object and stores all its TowerModels in the behaviors list of the dummy tower, and that works.

","tableOfContentsHtml":"","title":"Custom Byte Loaders"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

Certain mods that generate a lot of new TowerModels or other GameModel information (e.g. such as Ultimate Crosspathing) would rather generate all taht information once, export it, and load it each time the game starts rather than generating it new each time. This is where ModByteLoaders come in. They wrap the native BloonsTD6 FlatFileCodeGen system that the game itself uses to save and load the actual GameModel.

\n

ModByteLoader

\n

Unlike every other Mod____ class, you don't just go create ModByteLoaders from scratch. Instead, you use the ModByteLoader.Generate method dynamically while your Mod is running and it will generate the file for you, along with a .bytes file for you to include in your project for it to load from.

\n

Arguments

\n

T model The il2cpp model that you want to save. NO non-il2cpp types work here.

\n

string loaderFilePath The absolute path in your file system to generate the loader .cs file to

\n

string bytesFilePath The absolute path in your file system to generate the data .bytes file to

\n

For the two path properties, it's recommended to make use of the standardized Mod Sources folder location by doing

\n
Path.Combine(ModContent.GetInstance<YourModName>().ModSourcesPath, \"Relative\", \"Path\", \"Loader.cs\")\n
\n

Limitations

\n

Directly importing and exporting types like lists and arrays has proved buggy. To save and load multiple things at once, Ultimate Crosspathing simply creates a dummy TowerModel object and stores all its TowerModels in the behaviors list of the dummy tower, and that works.

","tableOfContentsHtml":"","title":"Custom Byte Loaders"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Custom-Load-Tasks.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Custom-Load-Tasks.json similarity index 68% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Custom-Load-Tasks.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Custom-Load-Tasks.json index cde0852dc..aa28ac367 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Custom-Load-Tasks.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Custom-Load-Tasks.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

Certain mods that have a big task that needs to performed when the game starts (such as Ultimate Crosspathing) can make use of Custom Load Tasks to add those tasks to the game's queue of tasks that run like Coroutines in Unity, happening over the course of multiple frames so that the game doesn't lock up.

\n

ModLoadTask

\n

Required Overrides

\n

DisplayName: What appears on screen when this task is running

\n

IEnumerator Coroutine: The task that the game should run.

\n

For those familiar with Unity Coroutines, this is like those except every yield return statement you do will be treated as a WaitForEndOfFrame.

\n

If you're not familiar, it's a way of taking advantage of C#'s IEnumerator class, the back bone of all things you can enumerate like arrays and lists, and using it to define a method that can be run in different sections over the course of multiple frames.

\n

When your task begins running, it'll execute all the code you've written in your Coroutine method up until you write

\n
yield return null;\n
\n

It'll then finish its execution for that frame and wait for the next one, where it will then continue where it left off until it reaches another yield return and so on until the end of the method.

\n

Reliability

\n

The ModLoadTask system relies on some complex patching behind the scenes that's subject to breakage when NK updates. Because of this, the Mod Helper automatically detects if the necessary patches were successful on startup, and if they weren't, it falls back to synchronously running the LoadTasks in one very laggy from on the Title Screen like the old days.

\n

The fact that you used a Load Task should never be the lone reason why your mod doesn't work.

\n

Example

\n

This task is used internally within the Mod Helper itself to wait for all the ModByteLoaders to be finished before continuing with other Load tasks. Show cases how you can use your yield statements even inside loops.

\n
internal class ByteWaitTask : ModLoadTask\n{\n    public override string DisplayName => \"Waiting for ByteLoaders...\";\n\n    /// <summary>\n    /// Don't automatically load this ModContent, it gets added specially\n    /// </summary>\n    public override IEnumerable<ModContent> Load() => Enumerable.Empty<ModContent>();\n\n    /// <summary>\n    /// Wait for the bytes to all be loaded\n    /// </summary>\n    public override IEnumerator Coroutine()\n    {\n        while (!ModByteLoader.loadedAllBytes)\n        {\n            yield return null;\n        }\n    }\n}\n
","tableOfContentsHtml":"","title":"Custom Load Tasks"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

Certain mods that have a big task that needs to performed when the game starts (such as Ultimate Crosspathing) can make use of Custom Load Tasks to add those tasks to the game's queue of tasks that run like Coroutines in Unity, happening over the course of multiple frames so that the game doesn't lock up.

\n

ModLoadTask

\n

Required Overrides

\n

DisplayName: What appears on screen when this task is running

\n

IEnumerator Coroutine: The task that the game should run.

\n

For those familiar with Unity Coroutines, this is like those except every yield return statement you do will be treated as a WaitForEndOfFrame.

\n

If you're not familiar, it's a way of taking advantage of C#'s IEnumerator class, the back bone of all things you can enumerate like arrays and lists, and using it to define a method that can be run in different sections over the course of multiple frames.

\n

When your task begins running, it'll execute all the code you've written in your Coroutine method up until you write

\n
yield return null;\n
\n

It'll then finish its execution for that frame and wait for the next one, where it will then continue where it left off until it reaches another yield return and so on until the end of the method.

\n

Reliability

\n

The ModLoadTask system relies on some complex patching behind the scenes that's subject to breakage when NK updates. Because of this, the Mod Helper automatically detects if the necessary patches were successful on startup, and if they weren't, it falls back to synchronously running the LoadTasks in one very laggy from on the Title Screen like the old days.

\n

The fact that you used a Load Task should never be the lone reason why your mod doesn't work.

\n

Example

\n

This task is used internally within the Mod Helper itself to wait for all the ModByteLoaders to be finished before continuing with other Load tasks. Show cases how you can use your yield statements even inside loops.

\n
internal class ByteWaitTask : ModLoadTask\n{\n    public override string DisplayName => \"Waiting for ByteLoaders...\";\n\n    /// <summary>\n    /// Don't automatically load this ModContent, it gets added specially\n    /// </summary>\n    public override IEnumerable<ModContent> Load() => Enumerable.Empty<ModContent>();\n\n    /// <summary>\n    /// Wait for the bytes to all be loaded\n    /// </summary>\n    public override IEnumerator Coroutine()\n    {\n        while (!ModByteLoader.loadedAllBytes)\n        {\n            yield return null;\n        }\n    }\n}\n
","tableOfContentsHtml":"","title":"Custom Load Tasks"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Custom-Menu-Screens.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Custom-Menu-Screens.json similarity index 63% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Custom-Menu-Screens.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Custom-Menu-Screens.json index 78356743a..e296d871b 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Custom-Menu-Screens.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Custom-Menu-Screens.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

3.0 helps with both the creation of new menu screens as well as just creating general new UI. This guide is about custom menu screens. For general UI, see Custom UI.

\n

ModGameMenu

\n

ModGameMenus integrate with the default game menus more smoothly by mimicking an existing menu and editing it rather than completely starting from scratch. For example, the Mod Helper Settings screen mimics the HotKeys screen, the Mods screen mimics the Extra Settings screen, and the Mod Browser mimics the Challenge Browser. This can be helpful because sometimes you may want to reuse those existing elements, but comes with the caveat that your custom menu can't be opened if the menu its mimicking is already open.

\n

Required Properties

\n

<T>: The type parameter for your ModGameMenu<T> class must be the existing BloonsTD6 GameMenu class that you're using as a base. Because of some annoying Il2Cpp method in-lining, not every screen can be easily used as a base.

\n
\nList of definitely supported `GameMenu` classes\n\n
\n

OnMenuOpened(): This method must be overriden, and it's what lets you modify/remove the elements of your base screen and add all the custom elements you want. Use the GameMenu property as your entry point to the Unity scene. For more information about creating UI here, see Custom UI.

\n

Other Properties

\n

OnMenuClosed(): Override if you want to perform effects when your menu gets closed

\n

OnMenuUpdate(): Override if you want to perform effects every frame that your menu is open

\n

Opening your Menu

\n

To open your custom menu, use the static method ModGameMenu.Open<YourModGameMenuType>().

\n

Example

","tableOfContentsHtml":"","title":"Custom Menu Screens"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

3.0 helps with both the creation of new menu screens as well as just creating general new UI. This guide is about custom menu screens. For general UI, see Custom UI.

\n

ModGameMenu

\n

ModGameMenus integrate with the default game menus more smoothly by mimicking an existing menu and editing it rather than completely starting from scratch. For example, the Mod Helper Settings screen mimics the HotKeys screen, the Mods screen mimics the Extra Settings screen, and the Mod Browser mimics the Challenge Browser. This can be helpful because sometimes you may want to reuse those existing elements, but comes with the caveat that your custom menu can't be opened if the menu its mimicking is already open.

\n

Required Properties

\n

<T>: The type parameter for your ModGameMenu<T> class must be the existing BloonsTD6 GameMenu class that you're using as a base. Because of some annoying Il2Cpp method in-lining, not every screen can be easily used as a base.

\n
\nList of definitely supported `GameMenu` classes\n\n
\n

OnMenuOpened(): This method must be overriden, and it's what lets you modify/remove the elements of your base screen and add all the custom elements you want. Use the GameMenu property as your entry point to the Unity scene. For more information about creating UI here, see Custom UI.

\n

Other Properties

\n

OnMenuClosed(): Override if you want to perform effects when your menu gets closed

\n

OnMenuUpdate(): Override if you want to perform effects every frame that your menu is open

\n

Opening your Menu

\n

To open your custom menu, use the static method ModGameMenu.Open<YourModGameMenuType>().

\n

Example

","tableOfContentsHtml":"","title":"Custom Menu Screens"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Custom-Textures-and-Displays.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Custom-Textures-and-Displays.json similarity index 78% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Custom-Textures-and-Displays.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Custom-Textures-and-Displays.json index 227f05aa4..ac05ffc75 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Custom-Textures-and-Displays.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Custom-Textures-and-Displays.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

This guide will cover both the inclusion of custom .png files to your mod and custom / modified 3D Models

\n

Custom Textures

\n

Including the PNGs

\n
\nThis section only applies anymore if you aren't following the mod template / didn't use the Create Mod button\n

To make sure that your non-code files actually end up being included inside your .dll mod file, you need to change the way your C# project treats them.

\n

\"Screenshot

\n

Right click on the file you want to include (probably a .png unlike the image) and go to Properties.

\n

Find the \"Build Action\" property and set its value to be \"Embedded Resource\".

\n

Now, when you build your project, the .png will be included in the .dll as a resource that the Mod Helper can work with.

\n
\n

Using the Textures

\n

The best way to access your textures once you've included them as resources is using methods found in the ModContent class. (read more about that here).

\n

If you're working in a class that extends ModContent, then you can use some of the non-static methods like GetTextureGUID(string name), GetSpriteReference(string name), GetTexture(string name), and GetSprite(string name) that return your texture in various forms that you might need it in.

\n

For all of those methods, the name parameter is the file name of your image without the .png file extension.

\n

If you're working somewhere outside of a class extending ModContent, then you'll use the equivalent static ModContent methods like ModContent.GetTexture<T>(string name) where T is your BloonsTD6Mod extending class. You have to specify the Mod class for these static methods in order for it get to the correct internal ID for it.

\n

ModDisplay

\n

The ModDisplay class provides for an easy way to use modified versions of existing 3d Display Models, or fully custom 2D Display Models.

\n

When you create your own class that extends ModDisplay, it will prompt you to override one Property and 1 Method.

\n

Required Properties

\n

BaseDisplay: Similar to the BaseTower property of ModTower, this is the Display that will be copied for your display. This is a GUID, so you can either just copy that in directly if you know it, or do something like public override string BaseDisplay => Game.instance.model.GetTower(TowerType.DartMonkey).display.GUID; There's also constants like Generic2dDisplay that you could use.

\n

ModifyDisplayNode(UnityDisplayNode node): Code to modify your base display node however you like.

\n

The most two most common things you'd do for a simple modified node would be:

\n

Set2DTexture(node, Name); to set a 2D Display Models texture to be the a .png with the same name as your ModDisplay class.

\n

or

\n

SetMeshTexture(node, Name) to set the main texture of the Node's SkinnedMeshRenderer to be a .png with the same name as your ModDisplay class.

\n

To get the .png files to edit for custom mesh textures, you can either use something like AssetStudio to get them from the game files yourself or just use the Mod Helpers extension method to do node.SaveMeshTexture(). You can specify the file path you want for the image, or if you leave it blank it will save to your local Bloons files at C:\\Users[name]\\AppData\\LocalLow\\Ninja Kiwi\\BloonsTD6

\n

Applying ModDisplays

\n

The easiest way to use your display is through our ApplyDisplay<T>() extension methods present on things that you'd be using them for like TowerModels, ProjectileModels or just DisplayModels.

\n

Note that for Towers, there's a special ModTowerDisplay class you ought to use that you can read about here.

\n

Fully Custom Displays

\n

Using Custom 3D models from outside the game requires more Unity knowledge than this tutorial covers at this time.\nHowever, if you are already in a situation where you have a Unity AssetBundle that contains Prefabs for your displays,\nthen you can follow these instructions to use them very simply.

\n

Including the AssetBundle

\n

Set your bundle to have the file extension .bundle and have it within your project. Mod Helper will automatically\nhandle loading from it as an embedded resource.

\n

ModCustomDisplay

\n

The ModCustomDisplay class (or ModTowerCustomDisplay) is what will let you use your custom displays. The two required properties are simply:

\n

AssetBundleName: The name of your asset bundle file (without the \".bundle\" part)

\n

PrefabName: The name of your Prefab within the bundle (case sensitive)

\n

Other class members you you can utilize are

\n

MaterialName: Set this to automatically apply a material from your bundle with the given name to your display

\n

ModifyDisplayNode: As with normal displays, you can modify the result display node with this

\n

Example that loads the prefab \"MyModel\" from \"assets.bundle\"

\n
public class MyCustomDisplay : ModCustomDisplay\n{\n    public override string AssetBundleName => \"assets\"; // loads from \"assets.bundle\"\n    public override string PrefabName => \"MyModel\"; // loads the \"MyModel\" prefab\n    \n    public override void ModifyDisplayNode(UnityDisplayNode node)\n    {\n        // modify the node however you want\n    }\n}\n
\n

You can then apply this display using the standard ApplyDisplay methods as normal.

","tableOfContentsHtml":"","title":"Custom Textures and Displays"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

This guide will cover both the inclusion of custom .png files to your mod and custom / modified 3D Models

\n

Custom Textures

\n

Including the PNGs

\n
\nThis section only applies anymore if you aren't following the mod template / didn't use the Create Mod button\n

To make sure that your non-code files actually end up being included inside your .dll mod file, you need to change the way your C# project treats them.

\n

\"Screenshot

\n

Right click on the file you want to include (probably a .png unlike the image) and go to Properties.

\n

Find the \"Build Action\" property and set its value to be \"Embedded Resource\".

\n

Now, when you build your project, the .png will be included in the .dll as a resource that the Mod Helper can work with.

\n
\n

Using the Textures

\n

The best way to access your textures once you've included them as resources is using methods found in the ModContent class. (read more about that here).

\n

If you're working in a class that extends ModContent, then you can use some of the non-static methods like GetTextureGUID(string name), GetSpriteReference(string name), GetTexture(string name), and GetSprite(string name) that return your texture in various forms that you might need it in.

\n

For all of those methods, the name parameter is the file name of your image without the .png file extension.

\n

If you're working somewhere outside of a class extending ModContent, then you'll use the equivalent static ModContent methods like ModContent.GetTexture<T>(string name) where T is your BloonsTD6Mod extending class. You have to specify the Mod class for these static methods in order for it get to the correct internal ID for it.

\n

ModDisplay

\n

The ModDisplay class provides for an easy way to use modified versions of existing 3d Display Models, or fully custom 2D Display Models.

\n

When you create your own class that extends ModDisplay, it will prompt you to override one Property and 1 Method.

\n

Required Properties

\n

BaseDisplay: Similar to the BaseTower property of ModTower, this is the Display that will be copied for your display. This is a GUID, so you can either just copy that in directly if you know it, or do something like public override string BaseDisplay => Game.instance.model.GetTower(TowerType.DartMonkey).display.GUID; There's also constants like Generic2dDisplay that you could use.

\n

ModifyDisplayNode(UnityDisplayNode node): Code to modify your base display node however you like.

\n

The most two most common things you'd do for a simple modified node would be:

\n

Set2DTexture(node, Name); to set a 2D Display Models texture to be the a .png with the same name as your ModDisplay class.

\n

or

\n

SetMeshTexture(node, Name) to set the main texture of the Node's SkinnedMeshRenderer to be a .png with the same name as your ModDisplay class.

\n

To get the .png files to edit for custom mesh textures, you can either use something like AssetStudio to get them from the game files yourself or just use the Mod Helpers extension method to do node.SaveMeshTexture(). You can specify the file path you want for the image, or if you leave it blank it will save to your local Bloons files at C:\\Users[name]\\AppData\\LocalLow\\Ninja Kiwi\\BloonsTD6

\n

Applying ModDisplays

\n

The easiest way to use your display is through our ApplyDisplay<T>() extension methods present on things that you'd be using them for like TowerModels, ProjectileModels or just DisplayModels.

\n

Note that for Towers, there's a special ModTowerDisplay class you ought to use that you can read about here.

\n

Fully Custom Displays

\n

Using Custom 3D models from outside the game requires more Unity knowledge than this tutorial covers at this time.\nHowever, if you are already in a situation where you have a Unity AssetBundle that contains Prefabs for your displays,\nthen you can follow these instructions to use them very simply.

\n

Including the AssetBundle

\n

Set your bundle to have the file extension .bundle and have it within your project. Mod Helper will automatically\nhandle loading from it as an embedded resource.

\n

ModCustomDisplay

\n

The ModCustomDisplay class (or ModTowerCustomDisplay) is what will let you use your custom displays. The two required properties are simply:

\n

AssetBundleName: The name of your asset bundle file (without the \".bundle\" part)

\n

PrefabName: The name of your Prefab within the bundle (case sensitive)

\n

Other class members you you can utilize are

\n

MaterialName: Set this to automatically apply a material from your bundle with the given name to your display

\n

ModifyDisplayNode: As with normal displays, you can modify the result display node with this

\n

Example that loads the prefab \"MyModel\" from \"assets.bundle\"

\n
public class MyCustomDisplay : ModCustomDisplay\n{\n    public override string AssetBundleName => \"assets\"; // loads from \"assets.bundle\"\n    public override string PrefabName => \"MyModel\"; // loads the \"MyModel\" prefab\n    \n    public override void ModifyDisplayNode(UnityDisplayNode node)\n    {\n        // modify the node however you want\n    }\n}\n
\n

You can then apply this display using the standard ApplyDisplay methods as normal.

","tableOfContentsHtml":"","title":"Custom Textures and Displays"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Custom-UI.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Custom-UI.json similarity index 65% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Custom-UI.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Custom-UI.json index 76c55e049..f95849e32 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Custom-UI.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Custom-UI.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

3.0 helps with both the creation of new menu screens as well as just creating general new UI. This guide is about general UI. For creating custom menu screens, see Custom Menus.

\n

For creating custom UI, it's highly recommended that you use the UnityExplorer mod to help whenever you have to edit the Unity objects directly.

\n

ModHelperComponents

\n

ModHelperComponents are custom Unity components that wrap / control base Unity components like Buttons, Scroll Panels, Dropdowns etc. Using them alongside the new VanillaSprites list lets you create UI elements just like default BloonsTD6 ones much more easily.

\n

All ModHelperComponents can easily add any other as a child using their AddX(...) methods like AddPanel(...).

\n

ModHelperPanel

\n

ModHelperScrollPanel

\n

The Info struct

\n

All methods of creating a ModHelper Component involve creating an Info object for it that defines the properties of it's Unity RectTransform like it's positions, scale, anchor, pivot etc. To make best use of these objects, it helps to have at least a basic understanding of Unity UI Layout

\n

Some tips about creating Info objects:

\n\n
new Info(\"Name\") \n{\n    Width = 500, Height = 200, Anchor = new Vector2(0, 1)\n}\n
\n","tableOfContentsHtml":"","title":"Custom UI (ModHelperComponents)"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

3.0 helps with both the creation of new menu screens as well as just creating general new UI. This guide is about general UI. For creating custom menu screens, see Custom Menus.

\n

For creating custom UI, it's highly recommended that you use the UnityExplorer mod to help whenever you have to edit the Unity objects directly.

\n

ModHelperComponents

\n

ModHelperComponents are custom Unity components that wrap / control base Unity components like Buttons, Scroll Panels, Dropdowns etc. Using them alongside the new VanillaSprites list lets you create UI elements just like default BloonsTD6 ones much more easily.

\n

All ModHelperComponents can easily add any other as a child using their AddX(...) methods like AddPanel(...).

\n

ModHelperPanel

\n

ModHelperScrollPanel

\n

The Info struct

\n

All methods of creating a ModHelper Component involve creating an Info object for it that defines the properties of it's Unity RectTransform like it's positions, scale, anchor, pivot etc. To make best use of these objects, it helps to have at least a basic understanding of Unity UI Layout

\n

Some tips about creating Info objects:

\n\n
new Info(\"Name\") \n{\n    Width = 500, Height = 200, Anchor = new Vector2(0, 1)\n}\n
\n","tableOfContentsHtml":"","title":"Custom UI (ModHelperComponents)"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Getting-Started.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Getting-Started.json similarity index 75% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Getting-Started.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Getting-Started.json index baa019760..adc2b7127 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Getting-Started.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Getting-Started.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

NOTE: This page is mostly obsolesced by the \"Create Mod\" button in Mod Helper, which automatically creates a mod for you using this template. If either the button or that zip work for you, then the steps on this page will have already been done for you.

\n

Creating a new Mod Project

\n

You'll want to make a new project of the type \"Class Library (.NET Framework)\"

\n

IMPORTANT: For the folder to create your project in, you should choose the \"BTD6 Mod Sources\" directory which is generated by default in your Documents folder when running the game with Mod Helper installed. If it's the correct folder, it will have a btd6.targets file in it.

\n

\"Screenshot

\n

I'd recommend checking the \"Place Solution and project in the same directory\" box on the next page, but that's up to you.

\n

Dependencies

\n

The new, easy way of doing dependencies is to utilize the btd6.targets file. With your project opened up, double click your project in the solution explorer to edit your .csproj file. You'll want to add the line <Import Project=\"..\\btd6.targets\" /> near the bottom, which will look something like this

\n

\"csproj

\n
\nThe Old / Manual Way of doing dependecies\n
\n

\"Screenshot

\n

You will want to add the following files as dependencies for your mod:

\n

Required

\n\n

Reccomended

\n\n

The most common location for your BloonsTD6 folder is \"C:\\Program Files (x86)\\Steam\\steamapps\\common\\BloonsTD6\" but you can also find it by going to steam and do Manage -> Browse Local Files

\n

\"Screenshot

\n
\n

Main Mod File

\n

In order to access all of the Mod Helper's features, you need a Main mod file that extends from BloonsTD6Mod instead of MelonMod.

\n
using BTD_Mod_Helper;\nusing MelonLoader;\n\n[assembly: MelonInfo(typeof(TemplateMod.Main), \"Your Mod Name\", \"1.0.0\", \"Your Name\")]\n[assembly: MelonGame(\"Ninja Kiwi\", \"BloonsTD6\")]\nnamespace TemplateMod\n{\n    public class Main : BloonsTD6Mod\n    {\n\t    \n    }\n}\n
\n

This will be important for many Mod Helper features, like Towers, In Game Mod Settings, Auto Updating, and Hooks.

\n

Compiling

\n

To actually compile your mod, you're going to want to enable the \"Build Toolbar\" in Visual Studio.

\n

\"Screenshot

\n

Then, when you hit the Build Button, it will compile your mod and create your .dll file in the \"...\\YourModName\\bin\\Debug\" folder by default.

\n

If you don't want to have to move the .dll file from there to your mods folder every time, then you can add a Post-Build Event to copy it.

\n

\"Screenshot

\n

The text is copy \"$(TargetDir)$(TargetFileName)\" \"C:\\Program Files (x86)\\Steam\\steamapps\\common\\BloonsTD6\\Mods\" /y

\n

You might need to change that path if your Bloons TD 6 is installed in a different location.

\n

That's It! That's all you need to create and build Bloons Mods

","tableOfContentsHtml":"","title":"Getting Started"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

NOTE: This page is mostly obsolesced by the \"Create Mod\" button in Mod Helper, which automatically creates a mod for you using this template. If either the button or that zip work for you, then the steps on this page will have already been done for you.

\n

Creating a new Mod Project

\n

You'll want to make a new project of the type \"Class Library (.NET Framework)\"

\n

IMPORTANT: For the folder to create your project in, you should choose the \"BTD6 Mod Sources\" directory which is generated by default in your Documents folder when running the game with Mod Helper installed. If it's the correct folder, it will have a btd6.targets file in it.

\n

\"Screenshot

\n

I'd recommend checking the \"Place Solution and project in the same directory\" box on the next page, but that's up to you.

\n

Dependencies

\n

The new, easy way of doing dependencies is to utilize the btd6.targets file. With your project opened up, double click your project in the solution explorer to edit your .csproj file. You'll want to add the line <Import Project=\"..\\btd6.targets\" /> near the bottom, which will look something like this

\n

\"csproj

\n
\nThe Old / Manual Way of doing dependecies\n
\n

\"Screenshot

\n

You will want to add the following files as dependencies for your mod:

\n

Required

\n\n

Reccomended

\n\n

The most common location for your BloonsTD6 folder is \"C:\\Program Files (x86)\\Steam\\steamapps\\common\\BloonsTD6\" but you can also find it by going to steam and do Manage -> Browse Local Files

\n

\"Screenshot

\n
\n

Main Mod File

\n

In order to access all of the Mod Helper's features, you need a Main mod file that extends from BloonsTD6Mod instead of MelonMod.

\n
using BTD_Mod_Helper;\nusing MelonLoader;\n\n[assembly: MelonInfo(typeof(TemplateMod.Main), \"Your Mod Name\", \"1.0.0\", \"Your Name\")]\n[assembly: MelonGame(\"Ninja Kiwi\", \"BloonsTD6\")]\nnamespace TemplateMod\n{\n    public class Main : BloonsTD6Mod\n    {\n\t    \n    }\n}\n
\n

This will be important for many Mod Helper features, like Towers, In Game Mod Settings, Auto Updating, and Hooks.

\n

Compiling

\n

To actually compile your mod, you're going to want to enable the \"Build Toolbar\" in Visual Studio.

\n

\"Screenshot

\n

Then, when you hit the Build Button, it will compile your mod and create your .dll file in the \"...\\YourModName\\bin\\Debug\" folder by default.

\n

If you don't want to have to move the .dll file from there to your mods folder every time, then you can add a Post-Build Event to copy it.

\n

\"Screenshot

\n

The text is copy \"$(TargetDir)$(TargetFileName)\" \"C:\\Program Files (x86)\\Steam\\steamapps\\common\\BloonsTD6\\Mods\" /y

\n

You might need to change that path if your Bloons TD 6 is installed in a different location.

\n

That's It! That's all you need to create and build Bloons Mods

","tableOfContentsHtml":"","title":"Getting Started"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Home.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Home.json new file mode 100644 index 000000000..8d02193f9 --- /dev/null +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Home.json @@ -0,0 +1 @@ +{"pageProps":{"data":{"contentHtml":"

Welcome to the BTD-Mod-Helper wiki!

\n

Here you'll find valuable information that we've gathered together to help you use our Mod Helper to make great mods.

\n

Use the Sidebar to the right to navigate to where you want to go.

\n

If you're new to Mod Making and looking to make your first mod, just go through the \"Starting BTD Modding\" category.

","tableOfContentsHtml":"","title":"Home"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/IL2CPP-Is-Weird.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/IL2CPP-Is-Weird.json similarity index 59% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/IL2CPP-Is-Weird.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/IL2CPP-Is-Weird.json index bda2a4f1a..f809e0c8c 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/IL2CPP-Is-Weird.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/IL2CPP-Is-Weird.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

Things that people need to know about IL2CPP

\n

IL2CPP Overview

\n

Moderns Bloons games are coded in C# (as you hopefully know at this point) yet are able to played cross-platform on Mac, IOS, Android etc despite that not being C#'s strong suit. This is accomplished by pretty much turning the C# Intermediary Language into C++, which is more compatible overall. Hence why it's called \"IL2CPP\".

\n

Why It Matters

\n

When making a Bloons Mod, you'll notice that any Bloons methods or data structures you interact with don't actually use the same versions of standard C# objects as normal. Instead of using System.Collections.Generic.List, Bloons will use Il2CppSystem.Collections.Generic.List, which has basically all the same functionality, but is not the same thing.

\n

Thus, you need to be careful with your imports, and be sure that you're using the version of a data structure that you think you are.

\n

Casting

\n

IL2CPP Objects can't just be casted between each other using normal C# (parentheses) casting. Instead, you have to use the .Cast<DesiredType>() method.

\n

Also useful is the .TryCast<DesiredType>() variant, which will return null if it's an invalid cast rather than failing with an Exception.

\n

Reflection

\n

If you want to do Reflection with Il2CppSystem Objects, then the main difference is that you need to use the GetIl2CppType() method instead of the GetType() method.

\n

If you ever find yourself with an Il2CppSystem.Object that you know to be a primitive type like an integer, you won't be able to just (cast) or even .Cast<>() it. You'll have to \"Unbox\" it via object.Unbox<int>().

\n

Similarly, if you have a primitive type that needs to be converted to an IL2CPP object, you'll have to \"Box\" it by doing new Int32 {m_value = integer}.BoxIl2CppObject();

","tableOfContentsHtml":"","title":"IL2CPP Is Weird"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

Things that people need to know about IL2CPP

\n

IL2CPP Overview

\n

Moderns Bloons games are coded in C# (as you hopefully know at this point) yet are able to played cross-platform on Mac, IOS, Android etc despite that not being C#'s strong suit. This is accomplished by pretty much turning the C# Intermediary Language into C++, which is more compatible overall. Hence why it's called \"IL2CPP\".

\n

Why It Matters

\n

When making a Bloons Mod, you'll notice that any Bloons methods or data structures you interact with don't actually use the same versions of standard C# objects as normal. Instead of using System.Collections.Generic.List, Bloons will use Il2CppSystem.Collections.Generic.List, which has basically all the same functionality, but is not the same thing.

\n

Thus, you need to be careful with your imports, and be sure that you're using the version of a data structure that you think you are.

\n

Casting

\n

IL2CPP Objects can't just be casted between each other using normal C# (parentheses) casting. Instead, you have to use the .Cast<DesiredType>() method.

\n

Also useful is the .TryCast<DesiredType>() variant, which will return null if it's an invalid cast rather than failing with an Exception.

\n

Reflection

\n

If you want to do Reflection with Il2CppSystem Objects, then the main difference is that you need to use the GetIl2CppType() method instead of the GetType() method.

\n

If you ever find yourself with an Il2CppSystem.Object that you know to be a primitive type like an integer, you won't be able to just (cast) or even .Cast<>() it. You'll have to \"Unbox\" it via object.Unbox<int>().

\n

Similarly, if you have a primitive type that needs to be converted to an IL2CPP object, you'll have to \"Box\" it by doing new Int32 {m_value = integer}.BoxIl2CppObject();

","tableOfContentsHtml":"","title":"IL2CPP Is Weird"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/In-Game-Mod-Settings.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/In-Game-Mod-Settings.json similarity index 68% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/In-Game-Mod-Settings.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/In-Game-Mod-Settings.json index b5f471cfc..eff6c43d3 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/In-Game-Mod-Settings.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/In-Game-Mod-Settings.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

Creating your own in-game mod options is very simple. All it involves is using certain ModSetting(thing) classes in your Main BloonsMod extending class instead of regular data types, and just using them as values like normal in your code.

\n

All ModSettings

\n

Any ModSetting(thing) class is created with a default value to use. They also all have a displayName that you can set, which by default will just be the name of the Field that you're assigning it to.

\n

Also, all mod setting classes use a cool C# feature called Implicit Operators. This means that C# will be able to automatically convert them into the types they represent without you having to do anything.

\n

But, in the couple situations where that won't work, you can always use their GetValue() method.

\n

ModSettingInt

\n

A ModSettingInt represents a setting for a whole number. You can specify the minValue and maxValue if you like.

\n

You can also set isSlider to true to have the setting display as a slider instead of a text entry. If you do this, you must set the minValue and maxValue options.

\n

ModSettingDouble

\n

The exact same as ModSettingInt but allowing for non-whole numbers like floats and doubles.

\n

ModSettingBool

\n

A ModSettingBool can just be either true or false. You can use isButton to make it display as a button instead of a checkbox.

\n

ModSettingString

\n

A ModSettingString holds a string, obviously. You can use validation to make the input box only accept certain characters.

\n

Examples

\n
public class Main : BloonsTD6Mod\n{\n    private static readonly ModSettingInt Cost = 500;  // implict operator in action\n\n    private static readonly ModSettingDouble Range = new ModSettingDouble(50.0)\n    {\n        displayName = \"Tower Range\",\n        minValue = 0.0,\n        maxValue = 100.0,\n        isSlider = true\n    };\n\n    private static readonly ModSettingBool SuperSecretSetting = false;\n\n    private static readonly ModSettingString Message = new ModSettingString(\"hey\")\n    {\n        validation = ModSettingString.Alphanumeric\n    };\n\n    /* Can just use these values like normal in the code */\n}\n
","tableOfContentsHtml":"","title":"In Game Mod Settings"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

Creating your own in-game mod options is very simple. All it involves is using certain ModSetting(thing) classes in your Main BloonsMod extending class instead of regular data types, and just using them as values like normal in your code.

\n

All ModSettings

\n

Any ModSetting(thing) class is created with a default value to use. They also all have a displayName that you can set, which by default will just be the name of the Field that you're assigning it to.

\n

Also, all mod setting classes use a cool C# feature called Implicit Operators. This means that C# will be able to automatically convert them into the types they represent without you having to do anything.

\n

But, in the couple situations where that won't work, you can always use their GetValue() method.

\n

ModSettingInt

\n

A ModSettingInt represents a setting for a whole number. You can specify the minValue and maxValue if you like.

\n

You can also set isSlider to true to have the setting display as a slider instead of a text entry. If you do this, you must set the minValue and maxValue options.

\n

ModSettingDouble

\n

The exact same as ModSettingInt but allowing for non-whole numbers like floats and doubles.

\n

ModSettingBool

\n

A ModSettingBool can just be either true or false. You can use isButton to make it display as a button instead of a checkbox.

\n

ModSettingString

\n

A ModSettingString holds a string, obviously. You can use validation to make the input box only accept certain characters.

\n

Examples

\n
public class Main : BloonsTD6Mod\n{\n    private static readonly ModSettingInt Cost = 500;  // implict operator in action\n\n    private static readonly ModSettingDouble Range = new ModSettingDouble(50.0)\n    {\n        displayName = \"Tower Range\",\n        minValue = 0.0,\n        maxValue = 100.0,\n        isSlider = true\n    };\n\n    private static readonly ModSettingBool SuperSecretSetting = false;\n\n    private static readonly ModSettingString Message = new ModSettingString(\"hey\")\n    {\n        validation = ModSettingString.Alphanumeric\n    };\n\n    /* Can just use these values like normal in the code */\n}\n
","tableOfContentsHtml":"","title":"In Game Mod Settings"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Install-Guide.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Install-Guide.json similarity index 78% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Install-Guide.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Install-Guide.json index 1a013ae0e..fa7dcc212 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Install-Guide.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Install-Guide.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

1. Have a valid copy of BTD6 on Steam or Epic

\n

We can't help you if you don't own a legitimately acquired copy of BTD6 on Steam or Epic.

\n

Mods for Android, IOS, or pirated clients are not supported

\n

2 Download the .NET Runtime

\n

If you don't have or are unsure whether you have the .NET 6.0 (or higher) runtime, you\nshould download it from Microsoft

\n

It is required for MelonLoader to work for IL2CPP games like BTD6.

\n

3. Install MelonLoader

\n

BTD Mod Helper requires MelonLoader v0.6.1. You should follow\nthe instructions here for downloading and using the MelonLoader\ninstaller. By default your BloonsTD6 folder will be located somewhere\nlike C:\\Program Files (x86)\\Steam\\steamapps\\common\\BloonsTD6. If that's not correct, you can right click the game in\nyour Steam library and select \"Manage\" > \"Browse Local Files\" to see where they are. For Epic, the default install path\nis or C:\\Program Files\\Epic Games\\BloonsTD6.

\n

Note: Currently, MelonLoader v0.6.1 is the specific version you should use.

\n

\"Melonloader

\n

When installing, you will need to uncheck the \"Latest\" checkbox as seen above and choose v0.6.1 from the list.

\n

After the installation, tour BloonsTD6 Folder should then look something like this:

\n

\"BloonsTD6

\n

Then, the next time you open the game, MelonLoader will spend some time generating the files it needs and also a new\nMods folder within your BloonsTD6 folder. It oughta look similar to

\n

\"BloonsTD6

\n

4. Install BTD Mod Helper

\n

Download the latest BTD6ModHelper.dll from the GitHub releases.\nYou can also press the shiny green button on the main page or just\nuse this direct link.

\n

The one and only installation step is put the Btd6ModHelper.dll file into your Mods folder. If you're updating from a\nversion older than 3.0, make sure to delete any previous BloonsTD6 Mod Helper.dll file.

\n

If you've done everything right, you should see a new \"Mods\" button in the bottom right corner of the BTD6 main menu\nwhen you run the game. (Remember that you need to restart to change mods!)

\n

5. Install more Mods

\n

As of Mod Helper 3.0 you can use the in-game Mod Browser to view mods that have been published on GitHub.

\n

Just press the button in the bottom right corner of the Main Menu to go to the Mods Screen, and then the Mod Browser\nbutton in the bottom right. Everything else from there should be self-explanatory!

\n

There is also now a website version of the Mod Browser.\nFor installing the mods downloaded from here (and other places),\nall you need to do is save/put the .dll file into your Mods folder in the same way as BtdModHelper.dll.

\n

The other best place for finding mods is from one of the BTD6 Modding discord communities:

\n

BTD6 Mods and Discussion

\n

It's not recommended for you to get mods from other sites such as Nexus Mods. Nothing against the site itself, but for\nBTD6 it just never caught on as a place for quality, good intentioned mods.

\n

Troubleshooting

\n

Common Issues

\n

Internal Failure / il2cpp_init_detour / .NET 6.0 runtime

\n

\"Screenshot

\n

This is the error you will get if you try to run the game without having the .NET 6.0 (or higher) Runtime.\nPlease download it from Microsoft.

\n

Missing Assembly-Charp.dll

\n

\"Screenshot

\n

An error such as Could not load file or assembly 'Assembly-CSharp, ...' means that MelonLoader did not install\ncorrectly.

\n

Open up the MelonLoader installer again and use the Uninstall feature. Then, try installing and opening the game again,\nmaking any/all of the following changes

\n\n

Other Tips

\n

You should not rename the BloonsTD6.exe file to anything else, or use different names for mod dll files.

\n

You should also not copy the BloonsTD6 install folder to somewhere else and run it from there.\nYou can make backups of your install folder, but always run the game from the actual path that Steam or Epic considers\nit to be installed at.

\n

Uninstalling

\n

To restore your BTD6 install to completely clean state so that it no longer recognizes you as a modder, you must do ALL\nof:

\n","tableOfContentsHtml":"","title":"Install Guide"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

1. Have a valid copy of BTD6 on Steam or Epic

\n

We can't help you if you don't own a legitimately acquired copy of BTD6 on Steam or Epic.

\n

Mods for Android, IOS, or pirated clients are not supported

\n

2 Download the .NET Runtime

\n

If you don't have or are unsure whether you have the .NET 6.0 (or higher) runtime, you\nshould download it from Microsoft

\n

It is required for MelonLoader to work for IL2CPP games like BTD6.

\n

3. Install MelonLoader

\n

BTD Mod Helper requires MelonLoader v0.6.1. You should follow\nthe instructions here for downloading and using the MelonLoader\ninstaller. By default your BloonsTD6 folder will be located somewhere\nlike C:\\Program Files (x86)\\Steam\\steamapps\\common\\BloonsTD6. If that's not correct, you can right click the game in\nyour Steam library and select \"Manage\" > \"Browse Local Files\" to see where they are. For Epic, the default install path\nis or C:\\Program Files\\Epic Games\\BloonsTD6.

\n

Note: Currently, MelonLoader v0.6.1 is the specific version you should use.

\n

\"Melonloader

\n

When installing, you will need to uncheck the \"Latest\" checkbox as seen above and choose v0.6.1 from the list.

\n

After the installation, tour BloonsTD6 Folder should then look something like this:

\n

\"BloonsTD6

\n

Then, the next time you open the game, MelonLoader will spend some time generating the files it needs and also a new\nMods folder within your BloonsTD6 folder. It oughta look similar to

\n

\"BloonsTD6

\n

4. Install BTD Mod Helper

\n

Download the latest BTD6ModHelper.dll from the GitHub releases.\nYou can also press the shiny green button on the main page or just\nuse this direct link.

\n

The one and only installation step is put the Btd6ModHelper.dll file into your Mods folder. If you're updating from a\nversion older than 3.0, make sure to delete any previous BloonsTD6 Mod Helper.dll file.

\n

If you've done everything right, you should see a new \"Mods\" button in the bottom right corner of the BTD6 main menu\nwhen you run the game. (Remember that you need to restart to change mods!)

\n

5. Install more Mods

\n

As of Mod Helper 3.0 you can use the in-game Mod Browser to view mods that have been published on GitHub.

\n

Just press the button in the bottom right corner of the Main Menu to go to the Mods Screen, and then the Mod Browser\nbutton in the bottom right. Everything else from there should be self-explanatory!

\n

There is also now a website version of the Mod Browser.\nFor installing the mods downloaded from here (and other places),\nall you need to do is save/put the .dll file into your Mods folder in the same way as BtdModHelper.dll.

\n

The other best place for finding mods is from one of the BTD6 Modding discord communities:

\n

BTD6 Mods and Discussion

\n

It's not recommended for you to get mods from other sites such as Nexus Mods. Nothing against the site itself, but for\nBTD6 it just never caught on as a place for quality, good intentioned mods.

\n

Troubleshooting

\n

Common Issues

\n

Internal Failure / il2cpp_init_detour / .NET 6.0 runtime

\n

\"Screenshot

\n

This is the error you will get if you try to run the game without having the .NET 6.0 (or higher) Runtime.\nPlease download it from Microsoft.

\n

Missing Assembly-Charp.dll

\n

\"Screenshot

\n

An error such as Could not load file or assembly 'Assembly-CSharp, ...' means that MelonLoader did not install\ncorrectly.

\n

Open up the MelonLoader installer again and use the Uninstall feature. Then, try installing and opening the game again,\nmaking any/all of the following changes

\n\n

Other Tips

\n

You should not rename the BloonsTD6.exe file to anything else, or use different names for mod dll files.

\n

You should also not copy the BloonsTD6 install folder to somewhere else and run it from there.\nYou can make backups of your install folder, but always run the game from the actual path that Steam or Epic considers\nit to be installed at.

\n

Uninstalling

\n

To restore your BTD6 install to completely clean state so that it no longer recognizes you as a modder, you must do ALL\nof:

\n","tableOfContentsHtml":"","title":"Install Guide"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Localization.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Localization.json new file mode 100644 index 000000000..823383edb --- /dev/null +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Localization.json @@ -0,0 +1 @@ +{"pageProps":{"data":{"contentHtml":"

Export Localization Button

\n

Mod Helper adds a new button in the Mods Menu to export a mod's localization to a json file, which can be edited to\nchange its supported displayed text for your language

\n\n

New Localization Behavior

\n

For Localization Entries, putting text within [Square Brackets] will make it try to fetch existing localization for that\nkey, e.g.

\n

The description is [DartMonkey Description] ->\nThe description is Throws a single dart at nearby Bloons. Short range and low pierce but cheap.

\n

Additionally, ModHelperText and ModHelperDropdown components Localize their texts by default.

\n

The text in mods that should be automatically supported for localization editing includes

\n\n

Adding More Localization Keys

\n

Classes like ModTower, ModUpgrade etc that extend from NamedModContent already automatically use localization keys\nfor their common text fields like DisplayName and Description. For adding more localized text, there are two\nadded options by mod helper (apart from just editing LocalizationManager.Instance.defaultTable directly)

\n

ModContent.Localize Calls

\n

ModContent.Localize methods can add new mod specific localizations from variables

\n
private static readonly string DoTheThing = ModContent.Localize<MyMod>(nameof(DoTheThing), \"Do The Thing!\");\n
\n

The result assigned to the DoTheThing is your mod specific localization key, that you can use in a\nModHelperText.SetText(...) directly or as DoTheThing.Localize() otherwise

\n

Generally speaking you'd want to use ModContent.Localize exactly as above, as a static variable.\nOther usages than that would still work, but would only make their localization key appear for purposes of the Export\nLocalization button if they got executed before the mods menu opened.

\n

NamedModContent.RegisterText Override

\n

Override the RegisterText method in any class that extends NamedModContent to directly add extra stuff to the text\ntable.

\n
public override void RegisterText(Il2CppSystem.Collections.Generic.Dictionary<string, string> textTable)\n{\n    base.RegisterText(textTable); // Call the base to still register DisplayName / Description\n          \n    textTable[Id + \" Long Description\"] = LongDescription; // More specific stuff to your ModContent\n}\n
\n

Supporting Other Languages

\n

The standard btd6.targets import automatically embeds /Localization/[Language].json files in your mod\nproject.

\n

You can use the Localization Button on your own mod with active language English to get a basis json for your mod

\n

TIP: If you press the \"Translate All\" button on the site it\nwill create a .zip file with all the correctly named .json files you'd need so you can just put those directly in\nyour Localization folder.

","tableOfContentsHtml":"","title":"Localization"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Looking-at-BTD6-Code-(Sorta).json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Looking-at-BTD6-Code-(Sorta).json similarity index 60% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Looking-at-BTD6-Code-(Sorta).json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Looking-at-BTD6-Code-(Sorta).json index ee7dc333b..f397ab485 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Looking-at-BTD6-Code-(Sorta).json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Looking-at-BTD6-Code-(Sorta).json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

dnSpy

\n

dnSpy is a program that lets you look into compiled Assemblies to see their\ncode, to a certain extent. For Bloons TD 6, this means we'll be\nopening ...\\BloonsTD6\\MelonLoader\\Managed\\Assembly-CSharp.dll file to look at the Main Bloons TD 6 code.\nIt'll look something like this: \"Screenshot

\n

You can navigate around the Assembly just using dnSpy, especially using the search function:\n\"screenshot

\n

or you can go to File -> Export to Project to save it as a .csproj that you can open up in your favorite IDE to navigate\naround in a more familiar way.\n\"Screenshot

\n

Limitations

\n

Unfortunately, due to the game's usage of IL2CPP,\nwe're limited in what we can see through this method.

\n

What We CAN See

\n\n

\"Screenshot

\n

What we CAN'T See

\n\n

When you look around the code, you'll basically as see the same pattern of Method stub used, which is basically: Convert\nparameters to C++y forms, call the particular C++ compiled native method, manually raise necessary exceptions.

\n

Needless to say, that information isn't really useful. This is not a method that will let you get an understanding of\nwhat Methods actually do and how they do it.

\n

Still, it can be useful to look at all the Names and Types of things within a Class

\n

ADVANCED: IDA

\n

You can use decompilation software like IDA on \"...\\BloonsTD6\\GameAssembly.dll\" to look at the actual assembly code to\nsee what methods do, or more accurately, look at IDA's attempt to generate C Pseudocode for that assembly code.

\n

More info coming at a later time.

","tableOfContentsHtml":"","title":"Looking at BTD6 Code (Sorta)"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

dnSpy

\n

dnSpy is a program that lets you look into compiled Assemblies to see their\ncode, to a certain extent. For Bloons TD 6, this means we'll be\nopening ...\\BloonsTD6\\MelonLoader\\Managed\\Assembly-CSharp.dll file to look at the Main Bloons TD 6 code.\nIt'll look something like this: \"Screenshot

\n

You can navigate around the Assembly just using dnSpy, especially using the search function:\n\"screenshot

\n

or you can go to File -> Export to Project to save it as a .csproj that you can open up in your favorite IDE to navigate\naround in a more familiar way.\n\"Screenshot

\n

Limitations

\n

Unfortunately, due to the game's usage of IL2CPP,\nwe're limited in what we can see through this method.

\n

What We CAN See

\n\n

\"Screenshot

\n

What we CAN'T See

\n\n

When you look around the code, you'll basically as see the same pattern of Method stub used, which is basically: Convert\nparameters to C++y forms, call the particular C++ compiled native method, manually raise necessary exceptions.

\n

Needless to say, that information isn't really useful. This is not a method that will let you get an understanding of\nwhat Methods actually do and how they do it.

\n

Still, it can be useful to look at all the Names and Types of things within a Class

\n

ADVANCED: IDA

\n

You can use decompilation software like IDA on \"...\\BloonsTD6\\GameAssembly.dll\" to look at the actual assembly code to\nsee what methods do, or more accurately, look at IDA's attempt to generate C Pseudocode for that assembly code.

\n

More info coming at a later time.

","tableOfContentsHtml":"","title":"Looking at BTD6 Code (Sorta)"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Making-a-Custom-Bloon.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Making-a-Custom-Bloon.json similarity index 83% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Making-a-Custom-Bloon.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Making-a-Custom-Bloon.json index ccb00042d..00f80cd05 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Making-a-Custom-Bloon.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Making-a-Custom-Bloon.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

This guide assumes that you already have at least a basic knowledge of C#, and have set up a modding environment as explained on this wiki.

\n

Creating custom Bloons comes in the form of creating classes that extend ModBloon.

\n

If you want to add a ModBloon to the game in a natural way, consider Making a Custom Round Set / Making a Custom Game Mode.

\n

ModBloon

\n

Required Properties

\n

BaseBloon: Akin to ModTower's BaseTower, this is the Id of the vanilla Bloon that you want to use as a base for this Bloon. use the Mod Helper provided BloonType class for an exact string.

\n

Optional Properties

\n

Camo, Fortified and Regrow: Makes the particular Bloon generate as having that particular property.

\n

KeepBaseId: If you're making a custom Bloon that's supposed to be an extension of a vanilla Bloon, like a Fortified Red Bloon, then set this to true to make sure your Bloon still counts as a vanilla Red Bloon.

\n

UseIconAsDisplay: Whether your Bloon's icon should just be it's display instead of having a separate (potentially 3D) ModDisplay. This will default to true if you make a MOAB class bloon.

\n

DamageStates: An array of display ids for your Bloon to have as it gets damaged. This is in order from least damaged to most damaged, and it will automatically evenly space the displays out between 100% and 0% health.

\n

Visuals

\n

You should provide a [Name]-Icon png/jpg for your Bloons icon in menus / the non-MOAB Bloon itself.

\n

There's also the ModBloonsDisplay class you can use to more easily manage your MOAB class displays. Set T to be your ModBloon class, then set the Damage property to be the index that the display should be in DamageStates, so 0 = undamaged, increasing from that being more and more damaged.

\n

Variations

\n

You might want to have different variations of your Bloon that are Fortified/Regrow/Camo etc. To do that, you can use the ModBloon<T> class setting T as your ModBloon to use it as your BaseBloon and modify it from there. You can then make use of the helper extensions BloonModel.MakeChildrenFortified, BloonModel.MakeChildrenRegrow and BloonModel.MakeChildrenCamo to easily change all the children. (Note: this doesn't create Bloons that don't already exist like Fortified Reds, just changes children like Ceramics into Fortified Ceramics because those actually exist)

\n

Examples

\n

The RGB Bloon, a non-MOAB class Bloon that turns into a Red, Blue and Green Bloon

\n
public class Rgb : ModBloon\n{\n    public override string BaseBloon => BloonType.Yellow;\n        \n    public override void ModifyBaseBloonModel(BloonModel bloonModel)\n    {\n        bloonModel.AddToChildren(BloonType.Blue);\n        bloonModel.AddToChildren(BloonType.Red);\n\n        bloonModel.hasChildrenWithDifferentTotalHealths = true;\n        bloonModel.distributeDamageToChildren = false;\n    }\n}\n\npublic class RgbRegrow : ModBloon<Rgb>\n{\n    public override bool Regrow => true;\n\n    public override void ModifyBaseBloonModel(BloonModel bloonModel)\n    {\n        bloonModel.MakeChildrenRegrow();\n    }\n}\n\npublic class RgbCamo : ModBloon<Rgb>\n{\n    public override bool Camo => true;\n\n    public override void ModifyBaseBloonModel(BloonModel bloonModel)\n    {\n        bloonModel.MakeChildrenCamo();\n    }\n}\n    \npublic class RgbRegrowCamo : ModBloon<Rgb>\n{\n    public override bool Regrow => true;\n    public override bool Camo => true;\n\n    public override void ModifyBaseBloonModel(BloonModel bloonModel)\n    {\n        bloonModel.MakeChildrenRegrow();\n        bloonModel.MakeChildrenCamo();\n    }\n}\n
\n

The ROFL, a MOAB class Bloon model that's an upgrade to the BAD and summons one of every base Bloon as children. Also its ModBloonDisplay, showcasing some advanced programmatic loading in action.

\n
/// <summary>\n/// Round Omnipotent Flying Leviathan\n/// </summary>\npublic class Rofl : ModBloon\n{\n    public override string BaseBloon => BloonType.Bad;\n        \n    public override void ModifyBaseBloonModel(BloonModel bloonModel)\n    {\n        bloonModel.maxHealth = bloonModel.leakDamage = 50000;\n        bloonModel.danger++;\n        bloonModel.layerNumber++;\n            \n        bloonModel.RemoveAllChildren();\n            \n        bloonModel.AddToChildren(BloonType.Red);\n        bloonModel.AddToChildren(BloonType.Blue);\n        bloonModel.AddToChildren(BloonType.Green);\n        bloonModel.AddToChildren<Rgb>();\n        bloonModel.AddToChildren(BloonType.Yellow);\n        bloonModel.AddToChildren(BloonType.Pink);\n        bloonModel.AddToChildren(BloonType.Purple);\n        bloonModel.AddToChildren(BloonType.Lead);\n        bloonModel.AddToChildren(BloonType.Black);\n        bloonModel.AddToChildren(BloonType.White);\n        bloonModel.AddToChildren(BloonType.Zebra);\n        bloonModel.AddToChildren(BloonType.Rainbow);\n        bloonModel.AddToChildren(BloonType.Ceramic);\n        bloonModel.AddToChildren(BloonType.Moab);\n        bloonModel.AddToChildren(BloonType.Bfb);\n        bloonModel.AddToChildren(BloonType.DdtCamo);\n        bloonModel.AddToChildren(BloonType.Zomg);\n        bloonModel.AddToChildren(BloonType.Bad);\n    }\n}\n    \npublic class RoflFortified : ModBloon<Rofl>\n{\n    public override bool Fortified => true;\n\n    public override void ModifyBaseBloonModel(BloonModel bloonModel)\n    {\n        bloonModel.maxHealth = bloonModel.leakDamage = 100000;\n            \n        bloonModel.MakeChildrenFortified();\n    }\n}\n\npublic class RoflDisplay : ModBloonDisplay<Rofl>\n{\n    public override string BaseDisplay => GetBloonDisplay(BloonType.Bad, Damage);\n\n    public override string Name => base.Name + Damage;\n\n    /// <summary>\n    /// Still need an empty constructor for the type to be loaded\n    /// </summary>\n    public RoflDisplay()\n    {\n    }\n\n    public override int Damage { get; }\n        \n    public RoflDisplay(int damage)\n    {\n        Damage = damage;\n    }\n    \n    public override IEnumerable<ModContent> Load()\n    {\n        for (var damage = 0; damage < 5; damage++)\n        {\n            yield return new RoflDisplay(damage);\n        }\n    }\n\n    public override void ModifyDisplayNode(UnityDisplayNode node)\n    {\n        foreach (var meshRenderer in node.GetMeshRenderers())\n        {\n            meshRenderer.SetMainTexture(GetTexture(Name)!);\n        }\n    }\n}\n\n
","tableOfContentsHtml":"","title":"Making a Custom Bloon"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

This guide assumes that you already have at least a basic knowledge of C#, and have set up a modding environment as explained on this wiki.

\n

Creating custom Bloons comes in the form of creating classes that extend ModBloon.

\n

If you want to add a ModBloon to the game in a natural way, consider Making a Custom Round Set / Making a Custom Game Mode.

\n

ModBloon

\n

Required Properties

\n

BaseBloon: Akin to ModTower's BaseTower, this is the Id of the vanilla Bloon that you want to use as a base for this Bloon. use the Mod Helper provided BloonType class for an exact string.

\n

Optional Properties

\n

Camo, Fortified and Regrow: Makes the particular Bloon generate as having that particular property.

\n

KeepBaseId: If you're making a custom Bloon that's supposed to be an extension of a vanilla Bloon, like a Fortified Red Bloon, then set this to true to make sure your Bloon still counts as a vanilla Red Bloon.

\n

UseIconAsDisplay: Whether your Bloon's icon should just be it's display instead of having a separate (potentially 3D) ModDisplay. This will default to true if you make a MOAB class bloon.

\n

DamageStates: An array of display ids for your Bloon to have as it gets damaged. This is in order from least damaged to most damaged, and it will automatically evenly space the displays out between 100% and 0% health.

\n

Visuals

\n

You should provide a [Name]-Icon png/jpg for your Bloons icon in menus / the non-MOAB Bloon itself.

\n

There's also the ModBloonsDisplay class you can use to more easily manage your MOAB class displays. Set T to be your ModBloon class, then set the Damage property to be the index that the display should be in DamageStates, so 0 = undamaged, increasing from that being more and more damaged.

\n

Variations

\n

You might want to have different variations of your Bloon that are Fortified/Regrow/Camo etc. To do that, you can use the ModBloon<T> class setting T as your ModBloon to use it as your BaseBloon and modify it from there. You can then make use of the helper extensions BloonModel.MakeChildrenFortified, BloonModel.MakeChildrenRegrow and BloonModel.MakeChildrenCamo to easily change all the children. (Note: this doesn't create Bloons that don't already exist like Fortified Reds, just changes children like Ceramics into Fortified Ceramics because those actually exist)

\n

Examples

\n

The RGB Bloon, a non-MOAB class Bloon that turns into a Red, Blue and Green Bloon

\n
public class Rgb : ModBloon\n{\n    public override string BaseBloon => BloonType.Yellow;\n        \n    public override void ModifyBaseBloonModel(BloonModel bloonModel)\n    {\n        bloonModel.AddToChildren(BloonType.Blue);\n        bloonModel.AddToChildren(BloonType.Red);\n\n        bloonModel.hasChildrenWithDifferentTotalHealths = true;\n        bloonModel.distributeDamageToChildren = false;\n    }\n}\n\npublic class RgbRegrow : ModBloon<Rgb>\n{\n    public override bool Regrow => true;\n\n    public override void ModifyBaseBloonModel(BloonModel bloonModel)\n    {\n        bloonModel.MakeChildrenRegrow();\n    }\n}\n\npublic class RgbCamo : ModBloon<Rgb>\n{\n    public override bool Camo => true;\n\n    public override void ModifyBaseBloonModel(BloonModel bloonModel)\n    {\n        bloonModel.MakeChildrenCamo();\n    }\n}\n    \npublic class RgbRegrowCamo : ModBloon<Rgb>\n{\n    public override bool Regrow => true;\n    public override bool Camo => true;\n\n    public override void ModifyBaseBloonModel(BloonModel bloonModel)\n    {\n        bloonModel.MakeChildrenRegrow();\n        bloonModel.MakeChildrenCamo();\n    }\n}\n
\n

The ROFL, a MOAB class Bloon model that's an upgrade to the BAD and summons one of every base Bloon as children. Also its ModBloonDisplay, showcasing some advanced programmatic loading in action.

\n
/// <summary>\n/// Round Omnipotent Flying Leviathan\n/// </summary>\npublic class Rofl : ModBloon\n{\n    public override string BaseBloon => BloonType.Bad;\n        \n    public override void ModifyBaseBloonModel(BloonModel bloonModel)\n    {\n        bloonModel.maxHealth = bloonModel.leakDamage = 50000;\n        bloonModel.danger++;\n        bloonModel.layerNumber++;\n            \n        bloonModel.RemoveAllChildren();\n            \n        bloonModel.AddToChildren(BloonType.Red);\n        bloonModel.AddToChildren(BloonType.Blue);\n        bloonModel.AddToChildren(BloonType.Green);\n        bloonModel.AddToChildren<Rgb>();\n        bloonModel.AddToChildren(BloonType.Yellow);\n        bloonModel.AddToChildren(BloonType.Pink);\n        bloonModel.AddToChildren(BloonType.Purple);\n        bloonModel.AddToChildren(BloonType.Lead);\n        bloonModel.AddToChildren(BloonType.Black);\n        bloonModel.AddToChildren(BloonType.White);\n        bloonModel.AddToChildren(BloonType.Zebra);\n        bloonModel.AddToChildren(BloonType.Rainbow);\n        bloonModel.AddToChildren(BloonType.Ceramic);\n        bloonModel.AddToChildren(BloonType.Moab);\n        bloonModel.AddToChildren(BloonType.Bfb);\n        bloonModel.AddToChildren(BloonType.DdtCamo);\n        bloonModel.AddToChildren(BloonType.Zomg);\n        bloonModel.AddToChildren(BloonType.Bad);\n    }\n}\n    \npublic class RoflFortified : ModBloon<Rofl>\n{\n    public override bool Fortified => true;\n\n    public override void ModifyBaseBloonModel(BloonModel bloonModel)\n    {\n        bloonModel.maxHealth = bloonModel.leakDamage = 100000;\n            \n        bloonModel.MakeChildrenFortified();\n    }\n}\n\npublic class RoflDisplay : ModBloonDisplay<Rofl>\n{\n    public override string BaseDisplay => GetBloonDisplay(BloonType.Bad, Damage);\n\n    public override string Name => base.Name + Damage;\n\n    /// <summary>\n    /// Still need an empty constructor for the type to be loaded\n    /// </summary>\n    public RoflDisplay()\n    {\n    }\n\n    public override int Damage { get; }\n        \n    public RoflDisplay(int damage)\n    {\n        Damage = damage;\n    }\n    \n    public override IEnumerable<ModContent> Load()\n    {\n        for (var damage = 0; damage < 5; damage++)\n        {\n            yield return new RoflDisplay(damage);\n        }\n    }\n\n    public override void ModifyDisplayNode(UnityDisplayNode node)\n    {\n        foreach (var meshRenderer in node.GetMeshRenderers())\n        {\n            meshRenderer.SetMainTexture(GetTexture(Name)!);\n        }\n    }\n}\n\n
","tableOfContentsHtml":"","title":"Making a Custom Bloon"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Making-a-Custom-Game-Mode.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Making-a-Custom-Game-Mode.json similarity index 70% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Making-a-Custom-Game-Mode.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Making-a-Custom-Game-Mode.json index 3b589e5b4..fd5cefb8c 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Making-a-Custom-Game-Mode.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Making-a-Custom-Game-Mode.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

This guide assumes that you already have at least a basic knowledge of C#, and have set up a modding environment as explained on this wiki.

\n

A custom Game Mode is essentially a completely unrestricted challenge editor mode that is present in the GUI as a button alongside the vanilla game modes like Deflation, Apopalypse or Half-Cash.

\n

ModGameMode

\n

Required Overrides

\n

BaseGameMode: A common pattern among modded types, this is the game mode to use as a starting point that you can edit from. Best to get the value from the Mod Helper provided GameModeType class, or GameModeType.None to start off empty.

\n

Difficulty: Which difficulty menu the button should be a part of, one of DifficultyType.Easy, DifficultyType.Medium or DifficultyType.Hard.

\n

ModifyBaseGameModeModel(ModModel): Add the custom rules to your Game Mode here. This will mostly come from adding/changing its MutatorModModels, or using extension methods to do that.

\n

Common Overrides

\n

DisplayName: What your Game Mode should be called in the UI

\n

Add an Icon (512x512) for your Game Mode to use in the round changer by using including a .png with the same name as your class, or using the Icon / IconReference properties.

\n

Tips

\n\n

Example

\n

This is a Game Mode to go alongside a custom All Regrow round set. It has a base of GameModeType.None because the properties of Medium difficulty apply by default unless manually overriden.

\n
public class AllRegrowMode : ModGameMode\n{\n    public override string Difficulty => DifficultyType.Medium;\n\n    public override string BaseGameMode => GameModeType.None;\n        \n    public override string DisplayName => \"All Regrow\";\n\n    public override string Icon => VanillaSprites.RegrowBloonIcon;\n\n    public override void ModifyBaseGameModeModel(ModModel gameModeModel)\n    {\n        gameModeModel.UseRoundSet<AllRegrow>();\n    }\n}\n
\n

A modified version of Deflation for Hard difficulty using the values from BTD5

\n
public class OldDeflation : ModGameMode\n{\n    public override string Difficulty => DifficultyType.Hard;\n        \n    public override string BaseGameMode => GameModeType.Deflation;\n        \n    public override void ModifyBaseGameModeModel(ModModel gameModeModel)\n    {\n        gameModeModel.SetStartingCash(50000);\n        gameModeModel.SetStartingRound(30);\n        gameModeModel.SetEndingRound(80);\n    }\n}\n
","tableOfContentsHtml":"","title":"Making a Custom Game Mode"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

This guide assumes that you already have at least a basic knowledge of C#, and have set up a modding environment as explained on this wiki.

\n

A custom Game Mode is essentially a completely unrestricted challenge editor mode that is present in the GUI as a button alongside the vanilla game modes like Deflation, Apopalypse or Half-Cash.

\n

ModGameMode

\n

Required Overrides

\n

BaseGameMode: A common pattern among modded types, this is the game mode to use as a starting point that you can edit from. Best to get the value from the Mod Helper provided GameModeType class, or GameModeType.None to start off empty.

\n

Difficulty: Which difficulty menu the button should be a part of, one of DifficultyType.Easy, DifficultyType.Medium or DifficultyType.Hard.

\n

ModifyBaseGameModeModel(ModModel): Add the custom rules to your Game Mode here. This will mostly come from adding/changing its MutatorModModels, or using extension methods to do that.

\n

Common Overrides

\n

DisplayName: What your Game Mode should be called in the UI

\n

Add an Icon (512x512) for your Game Mode to use in the round changer by using including a .png with the same name as your class, or using the Icon / IconReference properties.

\n

Tips

\n\n

Example

\n

This is a Game Mode to go alongside a custom All Regrow round set. It has a base of GameModeType.None because the properties of Medium difficulty apply by default unless manually overriden.

\n
public class AllRegrowMode : ModGameMode\n{\n    public override string Difficulty => DifficultyType.Medium;\n\n    public override string BaseGameMode => GameModeType.None;\n        \n    public override string DisplayName => \"All Regrow\";\n\n    public override string Icon => VanillaSprites.RegrowBloonIcon;\n\n    public override void ModifyBaseGameModeModel(ModModel gameModeModel)\n    {\n        gameModeModel.UseRoundSet<AllRegrow>();\n    }\n}\n
\n

A modified version of Deflation for Hard difficulty using the values from BTD5

\n
public class OldDeflation : ModGameMode\n{\n    public override string Difficulty => DifficultyType.Hard;\n        \n    public override string BaseGameMode => GameModeType.Deflation;\n        \n    public override void ModifyBaseGameModeModel(ModModel gameModeModel)\n    {\n        gameModeModel.SetStartingCash(50000);\n        gameModeModel.SetStartingRound(30);\n        gameModeModel.SetEndingRound(80);\n    }\n}\n
","tableOfContentsHtml":"","title":"Making a Custom Game Mode"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Making-a-Custom-Hero.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Making-a-Custom-Hero.json similarity index 81% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Making-a-Custom-Hero.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Making-a-Custom-Hero.json index c5ce38531..091b36819 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Making-a-Custom-Hero.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Making-a-Custom-Hero.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

This guide assumes that you already have at least a basic knowledge of C#, and have set up a modding environment as explained on this wiki. Without both of those things being true, this likely won't be a very useful resource for you.

\n

Making a custom hero is very much like Making a Custom Tower. You should be familiar with the information in that guide before reading this one, as some repeated information will be ommitted.

\n

The tl;dr of making a custom Hero is that you just make a custom Tower, but use the ModHero and ModLevel classes in place of ModTower and ModUpgrade. If you're someone who likes flying by the seat of your IDE's autocomplete, then that might be as much information as you need to get started.

\n

ModHero

\n

Required Properties

\n

Cost: Same as with ModTower

\n

BaseTower: Same as with ModTower

\n

DisplayName: Same as ModTower. This will usually be the name of the Hero, like \"Benjamin\"

\n

Description: Same as ModTower. The overall description of your Hero as it appears in menus.

\n

Title: The short description of your hero, like \"Code Monkey\" for Benjamin

\n

MaxLevel: Instead of the \"___PathUpgrades\" properties, you use this to define the max level of your hero. Like with those properties, don't preemptively set this to a higher number than the amount of ModHeroLevels you've actually created so far.

\n

Level1Description: The description of the level 1 upgrade of your hero. You won't be making a ModHeroLevel for level 1, just 2 and up, so this is defined here.

\n

XpRatio: How fast the hero levels up. Quincy, Gwendolin, Striker Jones, Obyn and Etienne have 1.0; Ezili, Pat Fusty, Brickell, and Sauda have 1.425; Benjamin and Psi have 1.5; and Captain Churchill and Adora have 1.71.

\n

Abilities: The total number of abilities that you've added for your Hero.

\n

Required Methods

\n

ModifyBaseTowerModel: Same as ModTower. This is defining the behavior of your Level 1 Hero.

\n

Visuals

\n

You'll want to include 4 images for your base hero:

\n\n

Also for the revamped hero select screen, you can override the NameStyle, BackgroundStyle and GlowStyle properties to be the TowerType.___ of the heroes you'd like to copy the respective elements of.

\n

Example

\n

A full example from the Industrial Farmer mod

\n
public class IndustrialFarmer : ModHero\n{\n    public override string BaseTower => TowerType.BananaFarmer;\n\n    public override int Cost => 1400;\n\n    public override string DisplayName => \"Norman\";\n    public override string Title => \"Industrial Farmer\";\n    public override string Level1Description => \"Collects nearby bananas. Your next Banana Farm is free.\";\n\n    public override string Description =>\n        \"Norman collects your Bananas and helps you expand your farming operations.\";\n\n\n    public override string NameStyle => TowerType.Gwendolin; // Yellow colored\n    public override string BackgroundStyle => TowerType.Etienne; // Yellow colored\n    public override string GlowStyle => TowerType.StrikerJones; // Yellow colored\n\n\n    public override int MaxLevel => 20;\n    public override float XpRatio => 1.0f;\n\n    public override int Abilities => 2;\n}\n\n
\n

ModHeroLevel

\n

Like with ModUpgrades, you'll want to declare these classes using your ModHero class's name as the type parameter to specify it's for them

\n
public class CustomLevel2 : ModHeroLevel<MyCutomHero>\n{\n    ...\n}\n
\n

Required Properties

\n

Level: Instead of Path and Tier like ModUpgrade, you just have this to signify what level this corresponds to.

\n

Optional Properties

\n

AbilityName: If this upgrade adds an ability, then you must indicate the DisplayName field of its AbilityModel hero

\n

AbilityDescription: What you want the displayed description of the ability to be

\n

Required Methods

\n

ApplyUpgrade(TowerModel towerModel): Just like ModUpgrade, apply the effects to the tower model that you want leveling up to provide.

\n

If you're adding a new Ability with this upgrade, as well as making use of the AbilityName and AbilityDescription properties, you should also be sure to include a line like this when constructing your AbilityModel.

\n
abilityModel.addedViaUpgrade = Id;\n
\n

This will help make sure the Ability is shown properly for this upgrade/level in the Hero screen.

\n

Visuals

\n

Like with ModUpgrades, if you include an image named after your ModUpgrade with \"-Portrait\" following it, then your hero will use that as its portrait if it's at least that level.

\n

Example

\n

A full example from the Industrial Farmer mod

\n
public class Level7 : ModHeroLevel<IndustrialFarmer>\n{\n    public override string Description => \"Range is increased.\";\n    public override int Level => 7;\n    public override void ApplyUpgrade(TowerModel towerModel)\n    {\n        towerModel.range += 15;\n        towerModel.GetBehavior<CollectCashZoneModel>().attractRange += 15;\n    }\n}\n
","tableOfContentsHtml":"","title":"Making a Custom Hero"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

This guide assumes that you already have at least a basic knowledge of C#, and have set up a modding environment as explained on this wiki. Without both of those things being true, this likely won't be a very useful resource for you.

\n

Making a custom hero is very much like Making a Custom Tower. You should be familiar with the information in that guide before reading this one, as some repeated information will be ommitted.

\n

The tl;dr of making a custom Hero is that you just make a custom Tower, but use the ModHero and ModLevel classes in place of ModTower and ModUpgrade. If you're someone who likes flying by the seat of your IDE's autocomplete, then that might be as much information as you need to get started.

\n

ModHero

\n

Required Properties

\n

Cost: Same as with ModTower

\n

BaseTower: Same as with ModTower

\n

DisplayName: Same as ModTower. This will usually be the name of the Hero, like \"Benjamin\"

\n

Description: Same as ModTower. The overall description of your Hero as it appears in menus.

\n

Title: The short description of your hero, like \"Code Monkey\" for Benjamin

\n

MaxLevel: Instead of the \"___PathUpgrades\" properties, you use this to define the max level of your hero. Like with those properties, don't preemptively set this to a higher number than the amount of ModHeroLevels you've actually created so far.

\n

Level1Description: The description of the level 1 upgrade of your hero. You won't be making a ModHeroLevel for level 1, just 2 and up, so this is defined here.

\n

XpRatio: How fast the hero levels up. Quincy, Gwendolin, Striker Jones, Obyn and Etienne have 1.0; Ezili, Pat Fusty, Brickell, and Sauda have 1.425; Benjamin and Psi have 1.5; and Captain Churchill and Adora have 1.71.

\n

Abilities: The total number of abilities that you've added for your Hero.

\n

Required Methods

\n

ModifyBaseTowerModel: Same as ModTower. This is defining the behavior of your Level 1 Hero.

\n

Visuals

\n

You'll want to include 4 images for your base hero:

\n\n

Also for the revamped hero select screen, you can override the NameStyle, BackgroundStyle and GlowStyle properties to be the TowerType.___ of the heroes you'd like to copy the respective elements of.

\n

Example

\n

A full example from the Industrial Farmer mod

\n
public class IndustrialFarmer : ModHero\n{\n    public override string BaseTower => TowerType.BananaFarmer;\n\n    public override int Cost => 1400;\n\n    public override string DisplayName => \"Norman\";\n    public override string Title => \"Industrial Farmer\";\n    public override string Level1Description => \"Collects nearby bananas. Your next Banana Farm is free.\";\n\n    public override string Description =>\n        \"Norman collects your Bananas and helps you expand your farming operations.\";\n\n\n    public override string NameStyle => TowerType.Gwendolin; // Yellow colored\n    public override string BackgroundStyle => TowerType.Etienne; // Yellow colored\n    public override string GlowStyle => TowerType.StrikerJones; // Yellow colored\n\n\n    public override int MaxLevel => 20;\n    public override float XpRatio => 1.0f;\n\n    public override int Abilities => 2;\n}\n\n
\n

ModHeroLevel

\n

Like with ModUpgrades, you'll want to declare these classes using your ModHero class's name as the type parameter to specify it's for them

\n
public class CustomLevel2 : ModHeroLevel<MyCutomHero>\n{\n    ...\n}\n
\n

Required Properties

\n

Level: Instead of Path and Tier like ModUpgrade, you just have this to signify what level this corresponds to.

\n

Optional Properties

\n

AbilityName: If this upgrade adds an ability, then you must indicate the DisplayName field of its AbilityModel hero

\n

AbilityDescription: What you want the displayed description of the ability to be

\n

Required Methods

\n

ApplyUpgrade(TowerModel towerModel): Just like ModUpgrade, apply the effects to the tower model that you want leveling up to provide.

\n

If you're adding a new Ability with this upgrade, as well as making use of the AbilityName and AbilityDescription properties, you should also be sure to include a line like this when constructing your AbilityModel.

\n
abilityModel.addedViaUpgrade = Id;\n
\n

This will help make sure the Ability is shown properly for this upgrade/level in the Hero screen.

\n

Visuals

\n

Like with ModUpgrades, if you include an image named after your ModUpgrade with \"-Portrait\" following it, then your hero will use that as its portrait if it's at least that level.

\n

Example

\n

A full example from the Industrial Farmer mod

\n
public class Level7 : ModHeroLevel<IndustrialFarmer>\n{\n    public override string Description => \"Range is increased.\";\n    public override int Level => 7;\n    public override void ApplyUpgrade(TowerModel towerModel)\n    {\n        towerModel.range += 15;\n        towerModel.GetBehavior<CollectCashZoneModel>().attractRange += 15;\n    }\n}\n
","tableOfContentsHtml":"","title":"Making a Custom Hero"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Making-a-Custom-Paragon.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Making-a-Custom-Paragon.json similarity index 82% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Making-a-Custom-Paragon.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Making-a-Custom-Paragon.json index d17aedf9c..60e8286d7 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Making-a-Custom-Paragon.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Making-a-Custom-Paragon.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

This guide assumes that you have an already working custom ModTower with all 3 upgrade paths implemented and all 5 upgrades each. If you don't have that then follow this guide and get all that created first.

\n

ModTower Changes

\n

To give your ModTower a Paragon, the only change you need to make is to override the ParagonMode property. You have the following options for it:

\n

ParagonMode.Base000: The Mod Helper will use the 0-0-0 version of your Tower as the base TowerModel for you to create the Paragon from.

\n

ParagonMode.Base555: The Mod Helper will use the 5-5-5 version of your Tower (same as you'd get when using the Ultimate Crosspathing mod) as the base TowerModel for you to create the Paragon from.

\n

There's also obviously ParagonMode.None, but that's just the default, and if you're reading this guide then you probably don't want to use that.

\n

For example, the Card Monkey mod uses the 555 mode.

\n
public class CardMonkey : ModTower {\n\n    /* ... */\n\n    public override ParagonMode ParagonMode => ParagonMode.Base555;\n\n    /* ... */\n\n}\n
\n

ModParagonUpgrade

\n

The next and most important step is to create a new class that extends ModParagonUpgrade, and to pass in your ModTower as its generic type.

\n

This ModParagonUpgrade has all the normal properties for you to override just like a normal ModUpgrade. The additional things to note are:

\n

ApplyUpgrade(TowerModel towerModel): Same functionality, this should handle all the logic of the attacks and behaviors of your Paragon. It does not need to handle giving your Paragon the ParagonTowerModel behavior, because instead...

\n

ParagonTowerModel: An optional property for the ParagonTowerModel behavior that should be given to this Paragon. If you don't override it, then the Boomerang Paragon's behavior will be used.

\n

RemoveAbilities: An optional property for automatically removing any abilities from the base TowerModel like real Paragons, defaults to true.

\n

Here's a complete example of a ModParagonUpgrade from the CardMonkey mod:

\n
public class GodKingOfSpades : ModParagonUpgrade<CardMonkey>\n{\n    public override int Cost => 400000;\n    public override string Description => \"Sometimes the hand of fate must be forced...\";\n    public override string DisplayName => \"God-King of Spades\";\n\n    // This is getting its Icon and Portrait from GodKingOfSpades-Icon.png and GodKingOfSpace-Portrait.png, so no other overriding needed\n\n    public override void ApplyUpgrade(TowerModel towerModel)\n    {\n        // Using 555 mode so not much has to be done here if you don't want to\n    }\n}\n
\n

New ModTowerDisplays

\n

Paragons use different displays based on what degree they are, and that's normally controlled by the ParagonTowerModel behavior. If you don't want to deal with that yourself, you can make use of some new features of ModTowerDisplays:

\n

ParagonDisplayIndex: A number between 0 and 4 (inclusive) representing which set of paragon degrees this display applies to

\n\n

If you don't have one for every index, then the next highest one will be used. By default on a ModTowerDisplay this is set to -1, meaning it won't interact with the ParagonTowerModel behavior. If you don't care about having different displays, just do everything normally and then set this to 0.

\n

UseForTower(int[] tiers): When overriding this method, return IsParagon(tiers) to have it be used for your Paragon.

\n

Here's a complete example of a ModTowerDisplay for a Paragon from Card Monkey. This uses the advanced method of overriding Load() to create multiple versions of the display, one for each ParagonDisplayIndex, in this case at a different scale for each.

\n
\npublic class CardMonkeyParagonDisplay : ModTowerDisplay<CardMonkey>\n{\n    public override float Scale => .75f + ParagonDisplayIndex * .025f;  // Higher degree Paragon displays will be bigger\n\n    public override string BaseDisplay =>  // The floating monkey part of the True Sun God\n        Game.instance.model.GetTower(TowerType.SuperMonkey, 5).GetAttackModel().GetBehavior<DisplayModel>().display;\n\n    public override bool UseForTower(int[] tiers)\n    {\n        return IsParagon(tiers);\n    }\n\n    /// <summary>\n    /// All classes that derive from ModContent MUST have a zero argument constructor to work\n    /// </summary>\n    public CardMonkeyParagonDisplay()\n    {\n    }\n\n    public CardMonkeyParagonDisplay(int i)\n    {\n        ParagonDisplayIndex = i;\n    }\n\n    public override int ParagonDisplayIndex { get; }  // Overriding in this way lets us set it in the constructor\n\n    /// <summary>\n    /// Create a display for each possible ParagonDisplayIndex\n    /// </summary>\n    /// <returns></returns>\n    public override IEnumerable<ModContent> Load()\n    {\n        for (var i = 0; i < TotalParagonDisplays; i++)\n        {\n            yield return new CardMonkeyParagonDisplay(i);\n        }\n    }\n\n\n    public override string Name => nameof(CardMonkeyParagonDisplay) + ParagonDisplayIndex;  // make sure each instance has its own name\n\n    /// <summary>\n    /// Could use the ParagonDisplayIndex property to use different effects based on the paragon strength\n    /// </summary>\n    /// <param name=\"node\"></param>\n    public override void ModifyDisplayNode(UnityDisplayNode node)\n    {\n        //node.PrintInfo();\n        //node.SaveMeshTexture();\n        SetMeshTexture(node, nameof(CardMonkeyParagonDisplay));\n    }\n}\n
\n
\n

Congratulations! You know have all the required information on the Mod Helper's role in making custom Paragons for your custom towers. Now you just gotta get into the nitty gritty with behaviors, or not, if you're satisfied with 555 mode.

","tableOfContentsHtml":"","title":"Making a Custom Paragon"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

This guide assumes that you have an already working custom ModTower with all 3 upgrade paths implemented and all 5 upgrades each. If you don't have that then follow this guide and get all that created first.

\n

ModTower Changes

\n

To give your ModTower a Paragon, the only change you need to make is to override the ParagonMode property. You have the following options for it:

\n

ParagonMode.Base000: The Mod Helper will use the 0-0-0 version of your Tower as the base TowerModel for you to create the Paragon from.

\n

ParagonMode.Base555: The Mod Helper will use the 5-5-5 version of your Tower (same as you'd get when using the Ultimate Crosspathing mod) as the base TowerModel for you to create the Paragon from.

\n

There's also obviously ParagonMode.None, but that's just the default, and if you're reading this guide then you probably don't want to use that.

\n

For example, the Card Monkey mod uses the 555 mode.

\n
public class CardMonkey : ModTower {\n\n    /* ... */\n\n    public override ParagonMode ParagonMode => ParagonMode.Base555;\n\n    /* ... */\n\n}\n
\n

ModParagonUpgrade

\n

The next and most important step is to create a new class that extends ModParagonUpgrade, and to pass in your ModTower as its generic type.

\n

This ModParagonUpgrade has all the normal properties for you to override just like a normal ModUpgrade. The additional things to note are:

\n

ApplyUpgrade(TowerModel towerModel): Same functionality, this should handle all the logic of the attacks and behaviors of your Paragon. It does not need to handle giving your Paragon the ParagonTowerModel behavior, because instead...

\n

ParagonTowerModel: An optional property for the ParagonTowerModel behavior that should be given to this Paragon. If you don't override it, then the Boomerang Paragon's behavior will be used.

\n

RemoveAbilities: An optional property for automatically removing any abilities from the base TowerModel like real Paragons, defaults to true.

\n

Here's a complete example of a ModParagonUpgrade from the CardMonkey mod:

\n
public class GodKingOfSpades : ModParagonUpgrade<CardMonkey>\n{\n    public override int Cost => 400000;\n    public override string Description => \"Sometimes the hand of fate must be forced...\";\n    public override string DisplayName => \"God-King of Spades\";\n\n    // This is getting its Icon and Portrait from GodKingOfSpades-Icon.png and GodKingOfSpace-Portrait.png, so no other overriding needed\n\n    public override void ApplyUpgrade(TowerModel towerModel)\n    {\n        // Using 555 mode so not much has to be done here if you don't want to\n    }\n}\n
\n

New ModTowerDisplays

\n

Paragons use different displays based on what degree they are, and that's normally controlled by the ParagonTowerModel behavior. If you don't want to deal with that yourself, you can make use of some new features of ModTowerDisplays:

\n

ParagonDisplayIndex: A number between 0 and 4 (inclusive) representing which set of paragon degrees this display applies to

\n\n

If you don't have one for every index, then the next highest one will be used. By default on a ModTowerDisplay this is set to -1, meaning it won't interact with the ParagonTowerModel behavior. If you don't care about having different displays, just do everything normally and then set this to 0.

\n

UseForTower(int[] tiers): When overriding this method, return IsParagon(tiers) to have it be used for your Paragon.

\n

Here's a complete example of a ModTowerDisplay for a Paragon from Card Monkey. This uses the advanced method of overriding Load() to create multiple versions of the display, one for each ParagonDisplayIndex, in this case at a different scale for each.

\n
\npublic class CardMonkeyParagonDisplay : ModTowerDisplay<CardMonkey>\n{\n    public override float Scale => .75f + ParagonDisplayIndex * .025f;  // Higher degree Paragon displays will be bigger\n\n    public override string BaseDisplay =>  // The floating monkey part of the True Sun God\n        Game.instance.model.GetTower(TowerType.SuperMonkey, 5).GetAttackModel().GetBehavior<DisplayModel>().display;\n\n    public override bool UseForTower(int[] tiers)\n    {\n        return IsParagon(tiers);\n    }\n\n    /// <summary>\n    /// All classes that derive from ModContent MUST have a zero argument constructor to work\n    /// </summary>\n    public CardMonkeyParagonDisplay()\n    {\n    }\n\n    public CardMonkeyParagonDisplay(int i)\n    {\n        ParagonDisplayIndex = i;\n    }\n\n    public override int ParagonDisplayIndex { get; }  // Overriding in this way lets us set it in the constructor\n\n    /// <summary>\n    /// Create a display for each possible ParagonDisplayIndex\n    /// </summary>\n    /// <returns></returns>\n    public override IEnumerable<ModContent> Load()\n    {\n        for (var i = 0; i < TotalParagonDisplays; i++)\n        {\n            yield return new CardMonkeyParagonDisplay(i);\n        }\n    }\n\n\n    public override string Name => nameof(CardMonkeyParagonDisplay) + ParagonDisplayIndex;  // make sure each instance has its own name\n\n    /// <summary>\n    /// Could use the ParagonDisplayIndex property to use different effects based on the paragon strength\n    /// </summary>\n    /// <param name=\"node\"></param>\n    public override void ModifyDisplayNode(UnityDisplayNode node)\n    {\n        //node.PrintInfo();\n        //node.SaveMeshTexture();\n        SetMeshTexture(node, nameof(CardMonkeyParagonDisplay));\n    }\n}\n
\n
\n

Congratulations! You know have all the required information on the Mod Helper's role in making custom Paragons for your custom towers. Now you just gotta get into the nitty gritty with behaviors, or not, if you're satisfied with 555 mode.

","tableOfContentsHtml":"","title":"Making a Custom Paragon"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Making-a-Custom-Round-Set.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Making-a-Custom-Round-Set.json similarity index 75% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Making-a-Custom-Round-Set.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Making-a-Custom-Round-Set.json index 5bea388d5..d8e7ca7e8 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Making-a-Custom-Round-Set.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Making-a-Custom-Round-Set.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

This guide assumes that you already have at least a basic knowledge of C#, and have set up a modding environment as explained on this wiki.

\n

A custom Round Set is just what it sounds like, a new collection of Rounds you can face alongside the vanilla default and ABR round sets. Round Sets can be used directly for any map if the \"Show Roundset Changer\" Mod Helper setting is enabled, or they can be used as part of a Custom Game Mode, something that actually adds a new Button in the mode select screen.

\n

ModRoundSet

\n

Common Overrides

\n

BaseRoundSet: A common pattern among modded types, this is the round set to use as a starting point that you can edit from. Best to use one of RoundSetType.Default, RoundSetType.ABR or RoundSetType.Empty to have an empty start.

\n

DefinedRounds: The total number of rounds that you will be customizing for this Round Set. Afterwards, randomized freeplay rounds start happening.

\n

Suggested Overrides

\n

DisplayName: What your Round Set should be called in the UI

\n

CustomHints and GetHint(int round): Set up custom hint messages to pop up as people play through your rounds.

\n

Add an Icon for your Round Set to use in the round changer by using including a .png with the same name as your class, or using the Icon / IconReference properties.

\n

Modifying Rounds

\n

There are a number of different methods you can override to help organize your modification/addition of rounds

\n

ModifyRoundsModels(RoundModel roundModel, int round): Called for every round 1 to DefinedRounds

\n

ModifyEasyRoundModels(RoundModel roundModel, int round): Called to modify specifically just rounds from 1 to 40

\n

ModifyMediumRoundModels(RoundModel roundModel, int round): Called to modify specifically just rounds from 41 to 60

\n

ModifyHardRoundModels(RoundModel roundModel, int round): Called to modify specifically just rounds from 61 to 80

\n

ModifyImpoppableRoundModels(RoundModel roundModel, int round): Called to modify specifically just rounds from 81 to 100

\n

Your round modification code will likely involve overriding a number of those methods and using a switch statement to define the individual rounds

\n
public override void ModifyEasyRoundModels(RoundModel roundModel, int round)\n{\n    switch(round)\n    {\n        case 1:\n            ...\n            roundModel.ClearBloonGroups();\n            ...\n            break;\n        case 2:\n            ...\n            roundModel.AddBloonGroup(...);\n            ...\n            break;\n        case 3:\n            ...\n            roundModel.AddBloonGroup<MyCustomBloon>(...);\n            ...\n            break;\n        case 4:\n            ...\n            roundModel.ReplaceBloonInGroups(...);\n            ...\n            break;\n        ...\n    }\n}\n
\n

Tips

\n\n

Example

\n

An all regrow version of the default round set, also showcasing the FindChangedBloonId extension method as an easy way to find regrow versions of Bloons, if they exist.

\n
public class AllRegrow : ModRoundSet\n{\n    public override string BaseRoundSet => RoundSetType.Default;\n    public override int DefinedRounds => BaseRounds.Count;\n    public override string DisplayName => \"All Regrow\";\n    public override string Icon => VanillaSprites.RegrowBloonIcon;\n\n    public override void ModifyRoundModels(RoundModel roundModel, int round)\n    {\n        foreach (var group in roundModel.groups)\n        {\n            var bloon = Game.instance.model.GetBloon(group.bloon);\n            if (bloon.FindChangedBloonId(bloonModel => bloonModel.isGrow = true, out var regrowBloon))\n            {\n                group.bloon = regrowBloon;\n            }\n        }\n    }\n}\n
","tableOfContentsHtml":"","title":"Making a Custom Round Set"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

This guide assumes that you already have at least a basic knowledge of C#, and have set up a modding environment as explained on this wiki.

\n

A custom Round Set is just what it sounds like, a new collection of Rounds you can face alongside the vanilla default and ABR round sets. Round Sets can be used directly for any map if the \"Show Roundset Changer\" Mod Helper setting is enabled, or they can be used as part of a Custom Game Mode, something that actually adds a new Button in the mode select screen.

\n

ModRoundSet

\n

Common Overrides

\n

BaseRoundSet: A common pattern among modded types, this is the round set to use as a starting point that you can edit from. Best to use one of RoundSetType.Default, RoundSetType.ABR or RoundSetType.Empty to have an empty start.

\n

DefinedRounds: The total number of rounds that you will be customizing for this Round Set. Afterwards, randomized freeplay rounds start happening.

\n

Suggested Overrides

\n

DisplayName: What your Round Set should be called in the UI

\n

CustomHints and GetHint(int round): Set up custom hint messages to pop up as people play through your rounds.

\n

Add an Icon for your Round Set to use in the round changer by using including a .png with the same name as your class, or using the Icon / IconReference properties.

\n

Modifying Rounds

\n

There are a number of different methods you can override to help organize your modification/addition of rounds

\n

ModifyRoundsModels(RoundModel roundModel, int round): Called for every round 1 to DefinedRounds

\n

ModifyEasyRoundModels(RoundModel roundModel, int round): Called to modify specifically just rounds from 1 to 40

\n

ModifyMediumRoundModels(RoundModel roundModel, int round): Called to modify specifically just rounds from 41 to 60

\n

ModifyHardRoundModels(RoundModel roundModel, int round): Called to modify specifically just rounds from 61 to 80

\n

ModifyImpoppableRoundModels(RoundModel roundModel, int round): Called to modify specifically just rounds from 81 to 100

\n

Your round modification code will likely involve overriding a number of those methods and using a switch statement to define the individual rounds

\n
public override void ModifyEasyRoundModels(RoundModel roundModel, int round)\n{\n    switch(round)\n    {\n        case 1:\n            ...\n            roundModel.ClearBloonGroups();\n            ...\n            break;\n        case 2:\n            ...\n            roundModel.AddBloonGroup(...);\n            ...\n            break;\n        case 3:\n            ...\n            roundModel.AddBloonGroup<MyCustomBloon>(...);\n            ...\n            break;\n        case 4:\n            ...\n            roundModel.ReplaceBloonInGroups(...);\n            ...\n            break;\n        ...\n    }\n}\n
\n

Tips

\n\n

Example

\n

An all regrow version of the default round set, also showcasing the FindChangedBloonId extension method as an easy way to find regrow versions of Bloons, if they exist.

\n
public class AllRegrow : ModRoundSet\n{\n    public override string BaseRoundSet => RoundSetType.Default;\n    public override int DefinedRounds => BaseRounds.Count;\n    public override string DisplayName => \"All Regrow\";\n    public override string Icon => VanillaSprites.RegrowBloonIcon;\n\n    public override void ModifyRoundModels(RoundModel roundModel, int round)\n    {\n        foreach (var group in roundModel.groups)\n        {\n            var bloon = Game.instance.model.GetBloon(group.bloon);\n            if (bloon.FindChangedBloonId(bloonModel => bloonModel.isGrow = true, out var regrowBloon))\n            {\n                group.bloon = regrowBloon;\n            }\n        }\n    }\n}\n
","tableOfContentsHtml":"","title":"Making a Custom Round Set"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Making-a-Custom-Tower.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Making-a-Custom-Tower.json similarity index 90% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Making-a-Custom-Tower.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Making-a-Custom-Tower.json index b1888cb17..e54feaecf 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Making-a-Custom-Tower.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Making-a-Custom-Tower.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

This guide assumes that you already have at least a basic knowledge of C#, and have set up a modding environment as explained on this wiki. Without both of those things being true, this likely won't be a very useful resource for you.

\n

If you want a better understanding of what exactly these steps actually do, then having at least a partial understanding of the ModContent system would be helpful.

\n

If you're not someone who likes following step by step written guides, you can look at these for some complete examples:

\n

Doombubbles' Card Monkey

\n

Void-n-Null's Banana Farmer Tower

\n

Doombubbles' Temple Base

\n

ModTower

\n

The first and most important part of making a custom Tower is to create a new class in your project that extends from ModTower. As soon as you add in : ModTower to your class, your IDE should prompt you to override a number of required Properties and one required Method. The explanations for those are as follows:

\n

Required Properties

\n

TowerSet: The family of Monkeys that your Tower should be put in. For now, just use one of the default constants provided of PRIMARY, MILITARY, MAGIC, or SUPPORT.

\n

BaseTower: The id of the default BTD Tower that your Tower is going to be copied from by default. So, if your Tower is most similar to a Dart Monkey, for instance, you should do public override string BaseTower => TowerType.DartMonkey;

\n

Cost: The base cost that your Tower should be on Medium difficulty.

\n

TopPathUpgrades: The number of Upgrades your Tower has / will have in its Top path.

\n

MiddlePathUpgrades: The number of Upgrades your Tower has / will have in its Middle path.

\n

BottomPathUpgrades: The number of Upgrades your Tower has / will have in its Bottom path.

\n

Description: The text description to use for this Tower, as seen in the Upgrade menu and stuff.

\n

ModifyBaseTowerModel

\n

ModifyBaseTowerModel(TowerModel towerModel) is the only required method for you to override, and it's the most important. Here you will handle actually making your Tower different from the one you defined in BaseTower.

\n

The towerModel variable represents a TowerModel object that has already been prepared by the Mod Helper for you to edit. Basically all of the simple things like name, id, tiers, appliedUpgrades, display have already been taken care of at this point, so the main thing you need to do here is change the Tower's behaviors.

\n

All this method actually needs to do is set up the 0-0-0 version of your Tower, because the ModUpgrade system will be doing the rest.

\n

Portrait and Icon

\n

The Icon and Portrait for your Tower are defaulted to being .png files named TowerClass-Portrait and TowerClass-Icon where TowerClass is the name of your class that extends ModTower.

\n

If you want to change this, then you can override the Portrait / Icon properties.

\n

OR, if you'd rather use existing SpriteReferences already in the game instead of adding new .pngs, you can override the PortraitReference and IconReference properties, and it won't try to use pngs.

\n

Example

\n

Here's a completed example of a ModTower class from the Card Monkey mod

\n
/* imports */\n\nnamespace CardMonkey\n{\n    /// <summary>\n    /// The main class that adds the core tower to the game\n    /// </summary>\n    public class CardMonkey : ModTower\n    {\n        // public override string Portrait => \"Don't need this, default CardMonkey-Portrait.png\";\n        // public override string Icon => \"Don't need this, default becomes CardMonkey-Icon.png\";\n\n        public override string TowerSet => PRIMARY;\n        public override string BaseTower => TowerType.DartMonkey;\n        public override int Cost => 400;\n\n        public override int TopPathUpgrades => 5;\n        public override int MiddlePathUpgrades => 5;\n        public override int BottomPathUpgrades => 5;\n        public override string Description => \"Throws playing cards at Bloons\";\n\n        // public override string DisplayName => \"Don't need this, by default becomes 'Card Monkey'\"\n\n        public override void ModifyBaseTowerModel(TowerModel towerModel)\n        {\n            towerModel.range += 10;\n            var attackModel = towerModel.GetAttackModel();\n            attackModel.range += 10;\n            \n            \n            var projectile = attackModel.weapons[0].projectile;\n            projectile.ApplyDisplay<RedCardDisplay>();  // Make the projectiles look like Cards\n            projectile.pierce += 2;\n        }\n\n    }\n}\n
\n
\n

ModUpgrade(s)

\n

This is one of the main reasons you'd want to use the Mod Helper for your custom Tower rather than doing it all yourself. Instead of having to define the behavior of every different crosspath of your Tower yourself, the Mod Helper can let you define your individual upgrades and write the exact changes that they apply to the TowerModel.

\n

For every Upgrade you want your Tower to have, create a class for it that extends ModUpgrade<TowerClass>, where TowerClass is your ModTower extending class that this upgrade is for. When you do, you'll have to override the following:

\n

Required Properties

\n

Path: Which path this is an upgrade for. Use the provided TOP, MIDDLE, and BOTTOM constants. (But they are just 0, 1, and 2)

\n

Tier: What tier the upgrade is, 1 - 5.

\n

Cost: The cost that your Upgrade should be on Medium difficulty.

\n

Description: The text description to use for this Upgrade, as seen in the Selection Menu and Upgrade Menu.

\n

ApplyUpgrade

\n

Similarly to ModTower, there's just one required method to override, and it's the most important.

\n

ApplyUpgrade(TowerModel towerModel) should contain the code to change a TowerModel from one that doesn't have the effects of this upgrade to one that does.

\n

Also similarly to TowerModel, the basic information of the tower is already there, so if you want this upgrade to have different effects depending on what tier the tower is, you can access towerModel.tiers or even towerModel.appliedUpgrades (just remember to use ModContent.UpgradeID<T>() to use the exact name).

\n

By default, ModUpgrades will be applied in tier order 1 - 5, doing Top -> Middle -> Bottom at each tier. If you want to change that, look at the optional Priority property.

\n

Portrait and Icon

\n

The Icon associated with your Upgrade and the Portrait for your Tower when this is its strongest upgrade are defaulted to being .png files named UpradeClass-Portrait and UpradeClass-Icon where UpradeClass is the name of your class that extends ModUpgrade.

\n

If you want to change this, then you can override the Portrait / Icon properties.

\n

The Mod Helper uses the same logic as the base game does for deciding that towers with two highest tier upgrades at the same tier should have portraits determined as Middle > Top > Bottom.

\n

Example

\n

Here's a completed example of a ModUpgrade class from the Card Monkey mod

\n
/* imports */\n\nnamespace CardMonkey.Upgrades.TopPath\n{\n    public class Pair : ModUpgrade<CardMonkey>\n    {\n        // public override string Portrait => \"Don't need this, by default becomes Pair-Portrait.png\";\n        // public override string Icon => \"Don't need this, by default becomes Pair-Icon.png\";\n\n        public override int Path => TOP;\n        public override int Tier => 1;\n        public override int Cost => 500;\n        \n        // public override string DisplayName => \"Don't need this, by default becomes 'Pair'\"\n        \n        public override string Description => \"Throws two cards at a time\";\n\n        public override void ApplyUpgrade(TowerModel tower)\n        {\n            tower.GetWeapon().emission = \n                new ArcEmissionModel(\"ArcEmissionModel_\", 2, 0, 10, null, false, false);\n        }\n    }\n}\n
\n
\n

Tower Visuals

\n

Just using the above steps, you can create a fully functioning Custom Tower. It's just gonna look exactly like the BaseTower we copied from :/

\n

If you want to give your Tower a custom look, you have two different options, with a third in the works by us.

\n

First, you can use the 2D Display Model system to just have your Tower rendered as an unanimated png. This is good if you don't want to dip your toes into the world of 3D Display Models even a little bit.

\n

Second, you can create ModTowerDisplay classes that are copies of existing BTD 3D models and change their colors and properties.

\n

2D Towers

\n

The first thing you need to do is to add public override bool Use2DModel => true; to your ModTower class.

\n

Then, you'll decide if you want to override the Get2DTexture(int[] tiers) method in your ModTower class.

\n

Get2DTexture takes in an int[3] and returns the file name of a the correct texture to display for the tower (no directory path or .png).

\n

By default, if you had a ModTower CardMonkey with tiers 2-3-0, it would try (in order): CardMonkey-230, CardMonkey-X3X, CardMonkey-2XX, CardMonkey.

\n

If you want to provide different functionality for getting the png file name for your tower, then override this method and do so, otherwise just include as many .pngs as you want with appropriate names and the ModTower will use them.

\n

ModTowerDisplays

\n

ModTowerDisplays are a special type of ModDisplay you can use that will automatically apply themselves to your Tower, so you don't have to deal with manually applying different displays in your ModUpgrade code.

\n

Before you even start this, make sure you've read through how to use normal ModDisplays. Once you understand that, then this should be very straightforward.

\n

Instead of extending ModDisplay with your class, extend ModTowerDisplay<TowerClass> where TowerClass is your class that extends ModTower.

\n

When you do this, instead of it requiring you to override ModifyDisplayNode(UnityDisplayNode node), it'll require you to override UseForTower(int[] tiers).

\n

UseForTower simply takes in an int[3] of the Tower's tiers and just returns true or false for if your Tower should use this Model at those given tiers.

\n

ModifyDisplayNode is not required to be overridden, but that's just because it now has the default behavior of setting the Mesh Texture of the Node to be a .png file with the same name as the class. If you want to do something more/other than that, you'll still want to override this method.

\n

Example

\n

Here's a completed example of a ModTowerDisplay class from the CardMonkey mod

\n
/* imports */\n\nnamespace CardMonkey.Displays.Tier5\n{\n    public class TFDisplay : ModTowerDisplay<CardMonkey>\n    {\n        public override string BaseDisplay => GetDisplay(TowerType.BoomerangMonkey, 0, 0, 4);\n\n        public override bool UseForTower(int[] tiers)\n        {\n            return tiers[2] == 5;\n        }\n\n        public override float Scale => 1.2f;\n\n        public override void ModifyDisplayNode(UnityDisplayNode node)\n        {\n            //node.SaveMeshTexture(); used this to get the texture to edit\n            //node.PrintInfo(); used this to get the bone names and other info\n            \n            node.RemoveBone(\"SuperMonkeyRig:Dart\");  // remove the boomerang from his hand\n            \n            // Name in this case is just 'TFDisplay' so it will find 'TFDiplay.png'\n            SetMeshTexture(node, Name);\n        }\n    }\n}\n
\n

Custom Tower Set

\n

If you would like your Tower to be part of a Custom Tower set, you simply need to make a ModTowerSet class.

\n
public class Cool : ModTowerSet\n{\n    public override string DisplayName => \"Cool Towers\";\n    \n    public override bool AllowInRestrictedModes => false; // Set to true to still allow these towers in Primary/Military/Magic only, etc\n\n    // public override string Button => \"Name of .png file for the group button used in the Monkeys menu, by default Name-Button\";\n\n    // public override string Container => \"Name of .png file for the background for towers in the Monkeys menu and the in game shop, by default Name-Container\";\n\n    // public override string ContainerLarge => \"Name of .png file for the background used for non-paragon upgrades in the Upgrade screen, by default Name-ContainerLarge\";\n\n    // public override string Portrait => \"Name of .png file for the background for in game portraits, by default Name-Portrait\";\n\n    /// <summary>\n    /// Set the ordering of this Tower Set, in this case after Primary.\n    /// If this wasn't here, it'd be added at the end after all other tower sets.\n    /// </summary>\n    public override int GetTowerSetIndex(List<TowerSet> towerSets) => towerSets.IndexOf(TowerSet.Primary) + 1;\n}\n
\n

Then, for any ModTower that you want to be part of the set, you change the definition of the class to

\n
public class MyCoolTower : ModTower<Cool>\n{\n    /* No override for the TowerSet property */\n    \n    public override int Order => 0; // Towers in your set will be sorted based on ascending Order\n    \n    /* ... */\n}\n
\n

See Image References

\n

Using a tool like Paint.net to change the hue would be a good way to get them how you want them to look.

\n
\n

Congratulations! You know have all the required information on the Mod Helper's role in making a fully featured Custom Tower.\nIt's actual functionality will come down to how you edit the Models within the ModifyBaseTower and ApplyUpgrade methods, which means interacting with Ninja Kiwi's own systems.\nThe Mod Helper's extensions can make that easier.

","tableOfContentsHtml":"","title":"Making a Custom Tower"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

This guide assumes that you already have at least a basic knowledge of C#, and have set up a modding environment as explained on this wiki. Without both of those things being true, this likely won't be a very useful resource for you.

\n

If you want a better understanding of what exactly these steps actually do, then having at least a partial understanding of the ModContent system would be helpful.

\n

If you're not someone who likes following step by step written guides, you can look at these for some complete examples:

\n

Doombubbles' Card Monkey

\n

Void-n-Null's Banana Farmer Tower

\n

Doombubbles' Temple Base

\n

ModTower

\n

The first and most important part of making a custom Tower is to create a new class in your project that extends from ModTower. As soon as you add in : ModTower to your class, your IDE should prompt you to override a number of required Properties and one required Method. The explanations for those are as follows:

\n

Required Properties

\n

TowerSet: The family of Monkeys that your Tower should be put in. For now, just use one of the default constants provided of PRIMARY, MILITARY, MAGIC, or SUPPORT.

\n

BaseTower: The id of the default BTD Tower that your Tower is going to be copied from by default. So, if your Tower is most similar to a Dart Monkey, for instance, you should do public override string BaseTower => TowerType.DartMonkey;

\n

Cost: The base cost that your Tower should be on Medium difficulty.

\n

TopPathUpgrades: The number of Upgrades your Tower has / will have in its Top path.

\n

MiddlePathUpgrades: The number of Upgrades your Tower has / will have in its Middle path.

\n

BottomPathUpgrades: The number of Upgrades your Tower has / will have in its Bottom path.

\n

Description: The text description to use for this Tower, as seen in the Upgrade menu and stuff.

\n

ModifyBaseTowerModel

\n

ModifyBaseTowerModel(TowerModel towerModel) is the only required method for you to override, and it's the most important. Here you will handle actually making your Tower different from the one you defined in BaseTower.

\n

The towerModel variable represents a TowerModel object that has already been prepared by the Mod Helper for you to edit. Basically all of the simple things like name, id, tiers, appliedUpgrades, display have already been taken care of at this point, so the main thing you need to do here is change the Tower's behaviors.

\n

All this method actually needs to do is set up the 0-0-0 version of your Tower, because the ModUpgrade system will be doing the rest.

\n

Portrait and Icon

\n

The Icon and Portrait for your Tower are defaulted to being .png files named TowerClass-Portrait and TowerClass-Icon where TowerClass is the name of your class that extends ModTower.

\n

If you want to change this, then you can override the Portrait / Icon properties.

\n

OR, if you'd rather use existing SpriteReferences already in the game instead of adding new .pngs, you can override the PortraitReference and IconReference properties, and it won't try to use pngs.

\n

Example

\n

Here's a completed example of a ModTower class from the Card Monkey mod

\n
/* imports */\n\nnamespace CardMonkey\n{\n    /// <summary>\n    /// The main class that adds the core tower to the game\n    /// </summary>\n    public class CardMonkey : ModTower\n    {\n        // public override string Portrait => \"Don't need this, default CardMonkey-Portrait.png\";\n        // public override string Icon => \"Don't need this, default becomes CardMonkey-Icon.png\";\n\n        public override string TowerSet => PRIMARY;\n        public override string BaseTower => TowerType.DartMonkey;\n        public override int Cost => 400;\n\n        public override int TopPathUpgrades => 5;\n        public override int MiddlePathUpgrades => 5;\n        public override int BottomPathUpgrades => 5;\n        public override string Description => \"Throws playing cards at Bloons\";\n\n        // public override string DisplayName => \"Don't need this, by default becomes 'Card Monkey'\"\n\n        public override void ModifyBaseTowerModel(TowerModel towerModel)\n        {\n            towerModel.range += 10;\n            var attackModel = towerModel.GetAttackModel();\n            attackModel.range += 10;\n            \n            \n            var projectile = attackModel.weapons[0].projectile;\n            projectile.ApplyDisplay<RedCardDisplay>();  // Make the projectiles look like Cards\n            projectile.pierce += 2;\n        }\n\n    }\n}\n
\n
\n

ModUpgrade(s)

\n

This is one of the main reasons you'd want to use the Mod Helper for your custom Tower rather than doing it all yourself. Instead of having to define the behavior of every different crosspath of your Tower yourself, the Mod Helper can let you define your individual upgrades and write the exact changes that they apply to the TowerModel.

\n

For every Upgrade you want your Tower to have, create a class for it that extends ModUpgrade<TowerClass>, where TowerClass is your ModTower extending class that this upgrade is for. When you do, you'll have to override the following:

\n

Required Properties

\n

Path: Which path this is an upgrade for. Use the provided TOP, MIDDLE, and BOTTOM constants. (But they are just 0, 1, and 2)

\n

Tier: What tier the upgrade is, 1 - 5.

\n

Cost: The cost that your Upgrade should be on Medium difficulty.

\n

Description: The text description to use for this Upgrade, as seen in the Selection Menu and Upgrade Menu.

\n

ApplyUpgrade

\n

Similarly to ModTower, there's just one required method to override, and it's the most important.

\n

ApplyUpgrade(TowerModel towerModel) should contain the code to change a TowerModel from one that doesn't have the effects of this upgrade to one that does.

\n

Also similarly to TowerModel, the basic information of the tower is already there, so if you want this upgrade to have different effects depending on what tier the tower is, you can access towerModel.tiers or even towerModel.appliedUpgrades (just remember to use ModContent.UpgradeID<T>() to use the exact name).

\n

By default, ModUpgrades will be applied in tier order 1 - 5, doing Top -> Middle -> Bottom at each tier. If you want to change that, look at the optional Priority property.

\n

Portrait and Icon

\n

The Icon associated with your Upgrade and the Portrait for your Tower when this is its strongest upgrade are defaulted to being .png files named UpradeClass-Portrait and UpradeClass-Icon where UpradeClass is the name of your class that extends ModUpgrade.

\n

If you want to change this, then you can override the Portrait / Icon properties.

\n

The Mod Helper uses the same logic as the base game does for deciding that towers with two highest tier upgrades at the same tier should have portraits determined as Middle > Top > Bottom.

\n

Example

\n

Here's a completed example of a ModUpgrade class from the Card Monkey mod

\n
/* imports */\n\nnamespace CardMonkey.Upgrades.TopPath\n{\n    public class Pair : ModUpgrade<CardMonkey>\n    {\n        // public override string Portrait => \"Don't need this, by default becomes Pair-Portrait.png\";\n        // public override string Icon => \"Don't need this, by default becomes Pair-Icon.png\";\n\n        public override int Path => TOP;\n        public override int Tier => 1;\n        public override int Cost => 500;\n        \n        // public override string DisplayName => \"Don't need this, by default becomes 'Pair'\"\n        \n        public override string Description => \"Throws two cards at a time\";\n\n        public override void ApplyUpgrade(TowerModel tower)\n        {\n            tower.GetWeapon().emission = \n                new ArcEmissionModel(\"ArcEmissionModel_\", 2, 0, 10, null, false, false);\n        }\n    }\n}\n
\n
\n

Tower Visuals

\n

Just using the above steps, you can create a fully functioning Custom Tower. It's just gonna look exactly like the BaseTower we copied from :/

\n

If you want to give your Tower a custom look, you have two different options, with a third in the works by us.

\n

First, you can use the 2D Display Model system to just have your Tower rendered as an unanimated png. This is good if you don't want to dip your toes into the world of 3D Display Models even a little bit.

\n

Second, you can create ModTowerDisplay classes that are copies of existing BTD 3D models and change their colors and properties.

\n

2D Towers

\n

The first thing you need to do is to add public override bool Use2DModel => true; to your ModTower class.

\n

Then, you'll decide if you want to override the Get2DTexture(int[] tiers) method in your ModTower class.

\n

Get2DTexture takes in an int[3] and returns the file name of a the correct texture to display for the tower (no directory path or .png).

\n

By default, if you had a ModTower CardMonkey with tiers 2-3-0, it would try (in order): CardMonkey-230, CardMonkey-X3X, CardMonkey-2XX, CardMonkey.

\n

If you want to provide different functionality for getting the png file name for your tower, then override this method and do so, otherwise just include as many .pngs as you want with appropriate names and the ModTower will use them.

\n

ModTowerDisplays

\n

ModTowerDisplays are a special type of ModDisplay you can use that will automatically apply themselves to your Tower, so you don't have to deal with manually applying different displays in your ModUpgrade code.

\n

Before you even start this, make sure you've read through how to use normal ModDisplays. Once you understand that, then this should be very straightforward.

\n

Instead of extending ModDisplay with your class, extend ModTowerDisplay<TowerClass> where TowerClass is your class that extends ModTower.

\n

When you do this, instead of it requiring you to override ModifyDisplayNode(UnityDisplayNode node), it'll require you to override UseForTower(int[] tiers).

\n

UseForTower simply takes in an int[3] of the Tower's tiers and just returns true or false for if your Tower should use this Model at those given tiers.

\n

ModifyDisplayNode is not required to be overridden, but that's just because it now has the default behavior of setting the Mesh Texture of the Node to be a .png file with the same name as the class. If you want to do something more/other than that, you'll still want to override this method.

\n

Example

\n

Here's a completed example of a ModTowerDisplay class from the CardMonkey mod

\n
/* imports */\n\nnamespace CardMonkey.Displays.Tier5\n{\n    public class TFDisplay : ModTowerDisplay<CardMonkey>\n    {\n        public override string BaseDisplay => GetDisplay(TowerType.BoomerangMonkey, 0, 0, 4);\n\n        public override bool UseForTower(int[] tiers)\n        {\n            return tiers[2] == 5;\n        }\n\n        public override float Scale => 1.2f;\n\n        public override void ModifyDisplayNode(UnityDisplayNode node)\n        {\n            //node.SaveMeshTexture(); used this to get the texture to edit\n            //node.PrintInfo(); used this to get the bone names and other info\n            \n            node.RemoveBone(\"SuperMonkeyRig:Dart\");  // remove the boomerang from his hand\n            \n            // Name in this case is just 'TFDisplay' so it will find 'TFDiplay.png'\n            SetMeshTexture(node, Name);\n        }\n    }\n}\n
\n

Custom Tower Set

\n

If you would like your Tower to be part of a Custom Tower set, you simply need to make a ModTowerSet class.

\n
public class Cool : ModTowerSet\n{\n    public override string DisplayName => \"Cool Towers\";\n    \n    public override bool AllowInRestrictedModes => false; // Set to true to still allow these towers in Primary/Military/Magic only, etc\n\n    // public override string Button => \"Name of .png file for the group button used in the Monkeys menu, by default Name-Button\";\n\n    // public override string Container => \"Name of .png file for the background for towers in the Monkeys menu and the in game shop, by default Name-Container\";\n\n    // public override string ContainerLarge => \"Name of .png file for the background used for non-paragon upgrades in the Upgrade screen, by default Name-ContainerLarge\";\n\n    // public override string Portrait => \"Name of .png file for the background for in game portraits, by default Name-Portrait\";\n\n    /// <summary>\n    /// Set the ordering of this Tower Set, in this case after Primary.\n    /// If this wasn't here, it'd be added at the end after all other tower sets.\n    /// </summary>\n    public override int GetTowerSetIndex(List<TowerSet> towerSets) => towerSets.IndexOf(TowerSet.Primary) + 1;\n}\n
\n

Then, for any ModTower that you want to be part of the set, you change the definition of the class to

\n
public class MyCoolTower : ModTower<Cool>\n{\n    /* No override for the TowerSet property */\n    \n    public override int Order => 0; // Towers in your set will be sorted based on ascending Order\n    \n    /* ... */\n}\n
\n

See Image References

\n

Using a tool like Paint.net to change the hue would be a good way to get them how you want them to look.

\n
\n

Congratulations! You know have all the required information on the Mod Helper's role in making a fully featured Custom Tower.\nIt's actual functionality will come down to how you edit the Models within the ModifyBaseTower and ApplyUpgrade methods, which means interacting with Ninja Kiwi's own systems.\nThe Mod Helper's extensions can make that easier.

","tableOfContentsHtml":"","title":"Making a Custom Tower"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Mod-Settings.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Mod-Settings.json similarity index 80% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Mod-Settings.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Mod-Settings.json index 6c446c673..368ddfe1d 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Mod-Settings.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Mod-Settings.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

Creating your own in-game mod options is very simple. All it involves is creating fields using ModSetting(thing) classes in your Main BloonsMod class instead of regular data types, and just using them as values like normal in your code.

\n

All ModSettings

\n

Any ModSetting(thing) class is created with a default value to use. They also all have a displayName that you can set, which by default will just be the name of the Field that you're assigning it to.

\n

Also, all mod setting classes use a cool C# feature called Implicit Operators. This means that C# will be able to automatically convert them into the types they represent without you having to do anything.

\n

But, in the couple situations where that won't work, you can always use their GetValue() method.

\n

New with 3.0, ModSettings can also be given an icon and a description that will be shown. You can also specify requiresRestart to make it visually apparent that a setting's affect only applies after a restart.

\n

For further customization, there's also a modifyOption parameter you can pass a function in to that will let you manually change the visuals, maybe with the new custom UI features.

\n

The onValueChanged field can be used to cause side effects while the setting is being edited in the menu, or onSave for when the value is saved upon leaving the menu. customValidation can be provided to prevent the saving of invalid values.

\n

ModSettingInt

\n

A ModSettingInt represents a setting for a whole number. You can specify the minValue and maxValue if you like.

\n

You can also set isSlider to true to have the setting display as a slider instead of a text entry. If you do this, you must set the minValue and maxValue options.

\n

ModSettingDouble

\n

The exact same as ModSettingInt but allowing for non-whole numbers like floats and doubles.

\n

ModSettingBool

\n

A ModSettingBool can just be either true or false. You can use button bool to make it display as an enable/disable button instead of a checkbox.

\n

ModSettingString

\n

A ModSettingString holds a string, obviously. You can use characterValidation to make the input box only accept certain characters.

\n

ModSettingButton

\n

A ModSettingButton defines an action that will be run when you press it. You can set the buttonText to be whatever you want.

\n

ModSettingEnum

\n

A ModSettingEnum displays a dropdown of all the different values of an Enum type you provide it. A labelFunction can be provided to change how each enum name is displayed.

\n

ModSettingHotkey

\n

A ModSettingHotkey creates a customizable hotkey. You create it with a default KeyCode and optionally a modifier to go with it. The methods IsPressed(), JustPressed() and JustReleased() can be used elsewhere in your code to check if/how the hotkey is currently being activated.

\n

ModSettingFile and ModSettingFolder

\n

ModSettings that let users open a Dialog Popup to select a file/folder on their computer.

\n

ModSettingCategory

\n

A special type of ModSetting that you can define and then sat as the category property of other ModSettings. You can decided whether it should be collapsed by default or not, and can still give it a displayName and icon like all others. The order field can help you position the category in relation to other settings and categories.

\n

Examples

\n
public class Main : BloonsTD6Mod\n{\n    public static readonly ModSettingInt Cost = 500;  // implict operator in action\n\n    public static readonly ModSettingDouble Range = new(50.0)\n    {\n        displayName = \"Tower Range\",\n        minValue = 0.0,\n        maxValue = 100.0,\n        isSlider = true\n    };\n\n    public static readonly ModSettingBool SuperSecretSetting = false;\n\n    public static readonly ModSettingString Message = new(\"hey\")\n    {\n        characterValidation = TMP_InputField.CharacterValidation.Alphanumeric\n    };\n\n    public static readonly ModSettingCategory Version3Features = new(\"Version 3.0 Features\")\n    {\n        collapsed = true\n    };\n\n    public static readonly ModSettingButton PushMe = new(() => ModHelper.Msg<Main>(\"The button was pushed!\"))\n    {\n        category = Version3Features,\n        buttonSprite = VanillaSprites.YellowBtnLong\n    };\n\n    public static readonly ModSettingEnum<MapDifficulty> Difficulty = new(MapDifficulty.Advanced)\n    {\n        category = Version3Features,\n        labelFunction = difficulty => difficulty.ToString().ToUpper() + \"!\"\n    };\n\n    public static readonly ModSettingHotkey SomethingSpecial = new(KeyCode.F4, HotkeyModifier.Alt)\n    {\n        category = Version3Features,\n        requiresRestart = true,\n        icon = VanillaSprites.DangerSoonIcon\n    };\n\n    public static readonly ModSettingFolder HomeworkFolder = new(\"\")\n    {\n        category = Version3Features,\n        onSave = folder => DoSomeResearch(folder)\n    };\n\n    /* Can just use these values like normal in the code */\n}\n
","tableOfContentsHtml":"","title":"Mod Settings"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

Creating your own in-game mod options is very simple. All it involves is creating fields using ModSetting(thing) classes in your Main BloonsMod class instead of regular data types, and just using them as values like normal in your code.

\n

All ModSettings

\n

Any ModSetting(thing) class is created with a default value to use. They also all have a displayName that you can set, which by default will just be the name of the Field that you're assigning it to.

\n

Also, all mod setting classes use a cool C# feature called Implicit Operators. This means that C# will be able to automatically convert them into the types they represent without you having to do anything.

\n

But, in the couple situations where that won't work, you can always use their GetValue() method.

\n

New with 3.0, ModSettings can also be given an icon and a description that will be shown. You can also specify requiresRestart to make it visually apparent that a setting's affect only applies after a restart.

\n

For further customization, there's also a modifyOption parameter you can pass a function in to that will let you manually change the visuals, maybe with the new custom UI features.

\n

The onValueChanged field can be used to cause side effects while the setting is being edited in the menu, or onSave for when the value is saved upon leaving the menu. customValidation can be provided to prevent the saving of invalid values.

\n

ModSettingInt

\n

A ModSettingInt represents a setting for a whole number. You can specify the minValue and maxValue if you like.

\n

You can also set isSlider to true to have the setting display as a slider instead of a text entry. If you do this, you must set the minValue and maxValue options.

\n

ModSettingDouble

\n

The exact same as ModSettingInt but allowing for non-whole numbers like floats and doubles.

\n

ModSettingBool

\n

A ModSettingBool can just be either true or false. You can use button bool to make it display as an enable/disable button instead of a checkbox.

\n

ModSettingString

\n

A ModSettingString holds a string, obviously. You can use characterValidation to make the input box only accept certain characters.

\n

ModSettingButton

\n

A ModSettingButton defines an action that will be run when you press it. You can set the buttonText to be whatever you want.

\n

ModSettingEnum

\n

A ModSettingEnum displays a dropdown of all the different values of an Enum type you provide it. A labelFunction can be provided to change how each enum name is displayed.

\n

ModSettingHotkey

\n

A ModSettingHotkey creates a customizable hotkey. You create it with a default KeyCode and optionally a modifier to go with it. The methods IsPressed(), JustPressed() and JustReleased() can be used elsewhere in your code to check if/how the hotkey is currently being activated.

\n

ModSettingFile and ModSettingFolder

\n

ModSettings that let users open a Dialog Popup to select a file/folder on their computer.

\n

ModSettingCategory

\n

A special type of ModSetting that you can define and then sat as the category property of other ModSettings. You can decided whether it should be collapsed by default or not, and can still give it a displayName and icon like all others. The order field can help you position the category in relation to other settings and categories.

\n

Examples

\n
public class Main : BloonsTD6Mod\n{\n    public static readonly ModSettingInt Cost = 500;  // implict operator in action\n\n    public static readonly ModSettingDouble Range = new(50.0)\n    {\n        displayName = \"Tower Range\",\n        minValue = 0.0,\n        maxValue = 100.0,\n        isSlider = true\n    };\n\n    public static readonly ModSettingBool SuperSecretSetting = false;\n\n    public static readonly ModSettingString Message = new(\"hey\")\n    {\n        characterValidation = TMP_InputField.CharacterValidation.Alphanumeric\n    };\n\n    public static readonly ModSettingCategory Version3Features = new(\"Version 3.0 Features\")\n    {\n        collapsed = true\n    };\n\n    public static readonly ModSettingButton PushMe = new(() => ModHelper.Msg<Main>(\"The button was pushed!\"))\n    {\n        category = Version3Features,\n        buttonSprite = VanillaSprites.YellowBtnLong\n    };\n\n    public static readonly ModSettingEnum<MapDifficulty> Difficulty = new(MapDifficulty.Advanced)\n    {\n        category = Version3Features,\n        labelFunction = difficulty => difficulty.ToString().ToUpper() + \"!\"\n    };\n\n    public static readonly ModSettingHotkey SomethingSpecial = new(KeyCode.F4, HotkeyModifier.Alt)\n    {\n        category = Version3Features,\n        requiresRestart = true,\n        icon = VanillaSprites.DangerSoonIcon\n    };\n\n    public static readonly ModSettingFolder HomeworkFolder = new(\"\")\n    {\n        category = Version3Features,\n        onSave = folder => DoSomeResearch(folder)\n    };\n\n    /* Can just use these values like normal in the code */\n}\n
","tableOfContentsHtml":"","title":"Mod Settings"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/ModContent.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/ModContent.json similarity index 73% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/ModContent.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/ModContent.json index cd2ab9788..cade2cbcc 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/ModContent.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/ModContent.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

Overview

\n

The ModContent class was added by the Mod Helper to manage the different custom elements of people's mods that the helper loads, like ModTower, ModUpgrade, ModDisplay, etc.

\n

All the different ModContent classes that you put in your mod will be automatically handled by the Mod Helper, which included being given a unique internal ID so that you don't have to worry about overlap with other mods.

\n

Because of this, the ModContent class comes with many static methods that you can use to access the different loaded elements.

\n

Helpeful Methods

\n

ModContent.GetInstance<T>() gets the primary instance of the type T, which is either a ModContent or a BloonsMod. For those new to C# this might seem a little odd, but the gist of why we do this is because we want to let people use Method and Property overrides while still having the classes behave pretty much statically.

\n

ModContent.TowerID<T>() and ModContent.UpgradeID<T>() get the internal IDs given to a ModTower or ModUpgrade by the Mod Helper.

\n

ModContent.GetTextureGUID<T>(string name), ModContent.GetSpriteReference<T>(string name), ModContent.GetTexture<T>(string name), ModContent.GetSprite<T>(string name) all help get your custom texture(s) in various formats you might want them in. You can read more about that here.

\n

Also note that since all the classes like ModTower are subclasses of ModContent, you can use all the above methods without putting ModContent. at the start with those classes.

\n

Loading Multiple Versions of a Single ModContent

\n

Note: this is an advanced feature that many people may never need to use.

\n

Sometimes you might want to make many different versions of a very similar bit of ModContent. Instead of having to manually make a bunch of files, you can override the Load() method in your ModContent. This is probably best illustrated with an example:

\n
 public class CardMonkeyBaseDisplay : ModTowerDisplay<CardMonkey>\n {\n     private readonly int[] t;  // the tiers for a specific display\n     \n     /// <summary>\n     /// All classes that derive from ModContent MUST still have a zero argument constructor to work\n     /// </summary>\n     public CardMonkeyBaseDisplay()\n     {\n         \n     }\n\n     public CardMonkeyBaseDisplay(int[] tiers)\n     {\n         t = tiers;\n     }\n\n     /// <summary>\n     /// This is an example of loading multiple instances of the same ModDisplay with different values\n     /// </summary>\n     /// <returns></returns>\n     public override IEnumerable<ModContent> Load()\n     {\n         for (var i = 0; i <= 2; i++)\n         {\n             for (var j = 0; j <= 2; j++)\n             {\n                 for (var k = 0; k <= 2; k++)\n                 {\n                     var tiers = new[] {i, j, k};\n                     if (tiers.IsValid())\n                     {\n                         yield return new CardMonkeyBaseDisplay(tiers);\n                     }\n                 }\n             }\n         }\n     }\n     \n     /* Using the t value for various overrides */\n}\n
\n

Now the Mod Helper will create a CardMonkeyBaseDisplay for all valid tier 2 or lower crosspaths.

\n

Note that if you do this, you'll then have to use ModContent.GetInstances<T>() for getting ALL instances of your ModContent and not just the first one.

","tableOfContentsHtml":"","title":"ModContent"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

Overview

\n

The ModContent class was added by the Mod Helper to manage the different custom elements of people's mods that the helper loads, like ModTower, ModUpgrade, ModDisplay, etc.

\n

All the different ModContent classes that you put in your mod will be automatically handled by the Mod Helper, which included being given a unique internal ID so that you don't have to worry about overlap with other mods.

\n

Because of this, the ModContent class comes with many static methods that you can use to access the different loaded elements.

\n

Helpeful Methods

\n

ModContent.GetInstance<T>() gets the primary instance of the type T, which is either a ModContent or a BloonsMod. For those new to C# this might seem a little odd, but the gist of why we do this is because we want to let people use Method and Property overrides while still having the classes behave pretty much statically.

\n

ModContent.TowerID<T>() and ModContent.UpgradeID<T>() get the internal IDs given to a ModTower or ModUpgrade by the Mod Helper.

\n

ModContent.GetTextureGUID<T>(string name), ModContent.GetSpriteReference<T>(string name), ModContent.GetTexture<T>(string name), ModContent.GetSprite<T>(string name) all help get your custom texture(s) in various formats you might want them in. You can read more about that here.

\n

Also note that since all the classes like ModTower are subclasses of ModContent, you can use all the above methods without putting ModContent. at the start with those classes.

\n

Loading Multiple Versions of a Single ModContent

\n

Note: this is an advanced feature that many people may never need to use.

\n

Sometimes you might want to make many different versions of a very similar bit of ModContent. Instead of having to manually make a bunch of files, you can override the Load() method in your ModContent. This is probably best illustrated with an example:

\n
 public class CardMonkeyBaseDisplay : ModTowerDisplay<CardMonkey>\n {\n     private readonly int[] t;  // the tiers for a specific display\n     \n     /// <summary>\n     /// All classes that derive from ModContent MUST still have a zero argument constructor to work\n     /// </summary>\n     public CardMonkeyBaseDisplay()\n     {\n         \n     }\n\n     public CardMonkeyBaseDisplay(int[] tiers)\n     {\n         t = tiers;\n     }\n\n     /// <summary>\n     /// This is an example of loading multiple instances of the same ModDisplay with different values\n     /// </summary>\n     /// <returns></returns>\n     public override IEnumerable<ModContent> Load()\n     {\n         for (var i = 0; i <= 2; i++)\n         {\n             for (var j = 0; j <= 2; j++)\n             {\n                 for (var k = 0; k <= 2; k++)\n                 {\n                     var tiers = new[] {i, j, k};\n                     if (tiers.IsValid())\n                     {\n                         yield return new CardMonkeyBaseDisplay(tiers);\n                     }\n                 }\n             }\n         }\n     }\n     \n     /* Using the t value for various overrides */\n}\n
\n

Now the Mod Helper will create a CardMonkeyBaseDisplay for all valid tier 2 or lower crosspaths.

\n

Note that if you do this, you'll then have to use ModContent.GetInstances<T>() for getting ALL instances of your ModContent and not just the first one.

","tableOfContentsHtml":"","title":"ModContent"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Prerequisites.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Prerequisites.json similarity index 62% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Prerequisites.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Prerequisites.json index 9ae54f4a6..e9b212316 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Prerequisites.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Prerequisites.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

This page covers what you need to have before you get started with BTD modding.

\n

Owning BTD6

\n

We are only providing support for modifying legitimately purchased copies of the game. Seriously, it's $10 and goes on sale all the time. Just buy it.

\n

Having an IDE (Integrated Development Environment)

\n

The kind of modding that we're supporting with the helper is a bit too advanced to just use a standard text editor like Notepad. You're going to want to use an actual C# IDE, with our recommendation being Visual Studio Community.

\n

Other viable options exist like JetBrains Rider (free 30 day trial, more familiar for IntelliJ users) or VSCode (free, more generalized, would need to download the right extensions for all required features.) In this guide however, we'll only be covering Visual Studio.

\n

Visual Studio

\n

Go through the Visual Studio installation process as normal, just being sure that you have selected the \".NET desktop development tools\" Workload.

\n

NEW WITH VS 2022: Make sure \".NET Framework 4.8 development tools\" and/or \".NET Framework 4.7.2 development tools\" are included in your workloads as well.

\n

Basic Understanding of C#

\n

This wiki is not a C# tutorial. There are many places online you can go to in order to learn more. BTD mods will almost always be open source, so you can also try to learn more by looking at them.

\n

Mod Helper Documentation

\n

Users of the Mod Helper may have noticed that our releases come with both a .dll file and .xml file. The .dll is obviously the mod itself, but the .xml file represents all the internal documentation that we've added to the Mod Helper.

\n

To be able to see all this documentation from within your IDE, all you have to do is make sure you have the .xml file in the same folder as the .dll file that you added to your project as a dependency.

\n

Then, you should be able to see helpful comments like on Mod Helper methods like this

\n

\"Screenshot

","tableOfContentsHtml":"","title":"Prerequisites"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

This page covers what you need to have before you get started with BTD modding.

\n

Owning BTD6

\n

We are only providing support for modifying legitimately purchased copies of the game. Seriously, it's $10 and goes on sale all the time. Just buy it.

\n

Having an IDE (Integrated Development Environment)

\n

The kind of modding that we're supporting with the helper is a bit too advanced to just use a standard text editor like Notepad. You're going to want to use an actual C# IDE, with our recommendation being Visual Studio Community.

\n

Other viable options exist like JetBrains Rider (free 30 day trial, more familiar for IntelliJ users) or VSCode (free, more generalized, would need to download the right extensions for all required features.) In this guide however, we'll only be covering Visual Studio.

\n

Visual Studio

\n

Go through the Visual Studio installation process as normal, just being sure that you have selected the \".NET desktop development tools\" Workload.

\n

NEW WITH VS 2022: Make sure \".NET Framework 4.8 development tools\" and/or \".NET Framework 4.7.2 development tools\" are included in your workloads as well.

\n

Basic Understanding of C#

\n

This wiki is not a C# tutorial. There are many places online you can go to in order to learn more. BTD mods will almost always be open source, so you can also try to learn more by looking at them.

\n

Mod Helper Documentation

\n

Users of the Mod Helper may have noticed that our releases come with both a .dll file and .xml file. The .dll is obviously the mod itself, but the .xml file represents all the internal documentation that we've added to the Mod Helper.

\n

To be able to see all this documentation from within your IDE, all you have to do is make sure you have the .xml file in the same folder as the .dll file that you added to your project as a dependency.

\n

Then, you should be able to see helpful comments like on Mod Helper methods like this

\n

\"Screenshot

","tableOfContentsHtml":"","title":"Prerequisites"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Useful-Resources.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Useful-Resources.json new file mode 100644 index 000000000..40b1eabad --- /dev/null +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Useful-Resources.json @@ -0,0 +1 @@ +{"pageProps":{"data":{"contentHtml":"

BTD6 Mods and Discussion Discord Server

\n

Guide for Installing Mods

\n

Harmony Patch Documentation

\n

BTD6 Harmony Patching

\n

Asset Studio

","tableOfContentsHtml":"","title":"Useful Resources"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Using-Mod-Helper-Hooks.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Using-Mod-Helper-Hooks.json similarity index 52% rename from _next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Using-Mod-Helper-Hooks.json rename to _next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Using-Mod-Helper-Hooks.json index 82fb64e02..bba1b7800 100644 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Using-Mod-Helper-Hooks.json +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/Using-Mod-Helper-Hooks.json @@ -1 +1 @@ -{"pageProps":{"data":{"contentHtml":"

The Mod Helper provides an assortment of \"Hooks\" that modders can use to very quickly and easily run code at certain times. All Hooks are methods that you can override from within your Main mod class that extends BloonsTD6Mod.

\n

Examples:

\n

OnGameModelLoaded(GameModel model) to edit the main GameModel when it's first created.

\n

OnNewGameModel(GameModel result) to edit a cloned GameModel for a new match. (You can read more about why you'd want to do that here)

\n

OnMainMenu() to do something whenever the player enters the Main Menu.

\n

OnTitleScreen() to do something when the game finishes loading everything and prepares the Title Screen for the player to click \"play\".

\n

OnTowerSaved(Tower tower, TowerSaveDataModel saveData) and OnTowerLoaded(Tower tower, TowerSaveDataModel saveData) to deal with saving and loading custom data for towers.

\n

To see all the hooks, just go into your Main mod class and start typing in \"override\", and your IDE should show you all the possible methods that you can override.

\n

At the end of the day, our hooks are just built-in Harmony Patches that we thought might be useful for a large number of people. Many mods will want to go beyond just these, and should thus take a look at Useful Resources for information about doing your own Harmony Patching, and Looking at BTD6 Code (Sorta) and BTD6 Internal Structure to find the right method to patch.

","tableOfContentsHtml":"","title":"Using Mod Helper Hooks"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file +{"pageProps":{"data":{"contentHtml":"

The Mod Helper provides an assortment of \"Hooks\" that modders can use to very quickly and easily run code at certain times. All Hooks are methods that you can override from within your Main mod class that extends BloonsTD6Mod.

\n

Examples:

\n

OnGameModelLoaded(GameModel model) to edit the main GameModel when it's first created.

\n

OnNewGameModel(GameModel result) to edit a cloned GameModel for a new match. (You can read more about why you'd want to do that here)

\n

OnMainMenu() to do something whenever the player enters the Main Menu.

\n

OnTitleScreen() to do something when the game finishes loading everything and prepares the Title Screen for the player to click \"play\".

\n

OnTowerSaved(Tower tower, TowerSaveDataModel saveData) and OnTowerLoaded(Tower tower, TowerSaveDataModel saveData) to deal with saving and loading custom data for towers.

\n

To see all the hooks, just go into your Main mod class and start typing in \"override\", and your IDE should show you all the possible methods that you can override.

\n

At the end of the day, our hooks are just built-in Harmony Patches that we thought might be useful for a large number of people. Many mods will want to go beyond just these, and should thus take a look at Useful Resources for information about doing your own Harmony Patching, and Looking at BTD6 Code (Sorta) and BTD6 Internal Structure to find the right method to patch.

","tableOfContentsHtml":"","title":"Using Mod Helper Hooks"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/_Sidebar.json b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/_Sidebar.json new file mode 100644 index 000000000..a03ccbf84 --- /dev/null +++ b/_next/data/v7IkQeifbKNILmx8QTc_Y/wiki/_Sidebar.json @@ -0,0 +1 @@ +{"pageProps":{"data":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":"","title":"_Sidebar"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n

Appearing in the Mod Browser

\n

Localization

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperSlider.json b/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperSlider.json deleted file mode 100644 index 14ebd8515..000000000 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Components.ModHelperSlider.json +++ /dev/null @@ -1 +0,0 @@ -{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Api.Components

\n

ModHelperSlider Class

\n

ModHelperComponent for a sliding input

\n
public class ModHelperSlider : BTD_Mod_Helper.Api.Components.ModHelperComponent\n
\n

Inheritance UnityEngine.MonoBehaviourModHelperComponent  ModHelperSlider

\n

Fields

\n

\n

ModHelperSlider.defaultValue Field

\n

The Default value, not scaled to anything

\n
public float defaultValue;\n
\n

Field Value

\n

System.Single

\n

Properties

\n

\n

ModHelperSlider.CurrentValue Property

\n

The real current value, scaled by the appropriate scale factor

\n
public float CurrentValue { get; }\n
\n

Property Value

\n

System.Single

\n

\n

ModHelperSlider.DefaultNotch Property

\n

The image showing where the default value is on the slider

\n
public BTD_Mod_Helper.Api.Components.ModHelperImage DefaultNotch { get; }\n
\n

Property Value

\n

ModHelperImage

\n

\n

ModHelperSlider.Fill Property

\n

The panel that's the filled up bar part of the slider

\n
public BTD_Mod_Helper.Api.Components.ModHelperPanel Fill { get; }\n
\n

Property Value

\n

ModHelperPanel

\n

\n

ModHelperSlider.Label Property

\n

The text that's on the notch of the slider

\n
public BTD_Mod_Helper.Api.Components.ModHelperText Label { get; }\n
\n

Property Value

\n

ModHelperText

\n

\n

ModHelperSlider.Slider Property

\n

The actual Slider component

\n
public Slider Slider { get; }\n
\n

Property Value

\n

UnityEngine.UI.Slider

\n

Methods

\n

\n

ModHelperSlider.Create(Info, float, float, float, float, Vector2, UnityAction, float, string, Nullable) Method

\n

Creates a new ModHelperSlider

\n
public static BTD_Mod_Helper.Api.Components.ModHelperSlider Create(BTD_Mod_Helper.Api.Components.Info info, float defaultValue, float minValue, float maxValue, float stepSize, Vector2 handleSize, UnityAction<float> onValueChanged=null, float fontSize=42f, string labelSuffix=\"\", System.Nullable<float> startingValue=null);\n
\n

Parameters

\n

\n

info Info

\n

The name/position/size info. NOTE: height must be a set value

\n

\n

defaultValue System.Single

\n

The default slider amount

\n

\n

minValue System.Single

\n

The minimum value of the slider

\n

\n

maxValue System.Single

\n

The maximum value of the slider

\n

\n

stepSize System.Single

\n

What value the slider should increase by per tick

\n

\n

handleSize UnityEngine.Vector2

\n

The height and width of the pip

\n

\n

onValueChanged UnityEngine.Events.UnityAction

\n

Action should happen when the slider changes value, or null

\n

\n

fontSize System.Single

\n

The size of the label text

\n

\n

labelSuffix System.String

\n

String to add to the end of the label, e.g. \"%\"

\n

\n

startingValue System.Nullable<System.Single>

\n

If not null, the value that this should start as instead of the default

\n

Returns

\n

ModHelperSlider

\n

\n

ModHelperSlider.SetCurrentValue(float, bool) Method

\n

Sets the current value of this

\n
public void SetCurrentValue(float value, bool sendCallback=true);\n
\n

Parameters

\n

\n

value System.Single

\n

The new value

\n

\n

sendCallback System.Boolean

\n

Whether the onValueChanged listener should fire

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Api.Components.ModHelperSlider"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModGameMenu_T_.json b/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModGameMenu_T_.json deleted file mode 100644 index 89b4fce64..000000000 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModGameMenu_T_.json +++ /dev/null @@ -1 +0,0 @@ -{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Api

\n

ModGameMenu Class

\n

Generic class for creating a ModGameMenu with the given type as it's base menu

\n
public abstract class ModGameMenu<T> : BTD_Mod_Helper.Api.ModGameMenu\n    where T : GameMenu\n
\n

Type parameters

\n

\n

T

\n

Inheritance System.ObjectModContentModGameMenu  ModGameMenu

\n

Properties

\n

\n

ModGameMenu.BaseMenu Property

\n

The string name of the in game menu to copy from

\n
public override string BaseMenu { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModGameMenu.GameMenu Property

\n

The current GameMenu

\n
public T GameMenu { get; }\n
\n

Property Value

\n

.T\">T

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Api.ModGameMenu_T_"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSetting.json b/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSetting.json deleted file mode 100644 index 92ec53740..000000000 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.ModOptions.ModSetting.json +++ /dev/null @@ -1 +0,0 @@ -{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Api.ModOptions

\n

ModSetting Class

\n

Base class for a ModSetting without the generics

\n
public abstract class ModSetting\n
\n

Inheritance System.Object  ModSetting

\n

Derived
\n↳ \">ModSetting<T>
\n↳ ModSettingButton

\n

Fields

\n

\n

ModSetting.category Field

\n

The category that this is part of, or null

\n
public ModSettingCategory category;\n
\n

Field Value

\n

ModSettingCategory

\n

\n

ModSetting.description Field

\n

The description / explanation of this mod setting

\n
public string description;\n
\n

Field Value

\n

System.String

\n

\n

ModSetting.displayName Field

\n

The exact name displayed for this mod setting. If unset, will use the variable name.

\n
public string displayName;\n
\n

Field Value

\n

System.String

\n

\n

ModSetting.icon Field

\n

Icon to display alongside the setting

\n
public string icon;\n
\n

Field Value

\n

System.String

\n

\n

ModSetting.modifyOption Field

\n

Action to modify the ModHelperOption after it's created

\n
public Action<ModHelperOption> modifyOption;\n
\n

Field Value

\n

System.Action<ModHelperOption>

\n

\n

ModSetting.requiresRestart Field

\n

Indicates to players that the effects of changing this setting will only take place after a restart

\n
public bool requiresRestart;\n
\n

Field Value

\n

System.Boolean

\n

\n

ModSetting.source Field

\n

The type where this ModSettings was defined

\n
public IModSettings source;\n
\n

Field Value

\n

IModSettings

\n

Methods

\n

\n

ModSetting.CreateBaseOption() Method

\n

Creates a base ModHelperOption component based on the name, description and icon of this

\n
protected BTD_Mod_Helper.Api.Components.ModHelperOption CreateBaseOption();\n
\n

Returns

\n

ModHelperOption

\n

\n

ModSetting.GetDefaultValue() Method

\n

Gets the default value for this ModSetting

\n
public virtual object GetDefaultValue();\n
\n

Returns

\n

System.Object
\nThe default value

\n

\n

ModSetting.GetValue() Method

\n

Gets the current value that this ModSetting holds

\n
public virtual object GetValue();\n
\n

Returns

\n

System.Object
\nThe value

\n

\n

ModSetting.SetValue(object) Method

\n

Sets the current value of this ModSetting

\n
public virtual void SetValue(object val);\n
\n

Parameters

\n

\n

val System.Object

\n

The new value

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Api.ModOptions.ModSetting"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModHero.json b/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModHero.json deleted file mode 100644 index baec796d4..000000000 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModHero.json +++ /dev/null @@ -1 +0,0 @@ -{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Api.Towers

\n

ModHero Class

\n

Class for adding a custom Hero to the game. Use alongside ModHeroLevel to give multiple levels.

\n
public abstract class ModHero : BTD_Mod_Helper.Api.Towers.ModTower\n
\n

Inheritance System.ObjectModContentNamedModContentModTower  ModHero

\n

Properties

\n

\n

ModHero.Abilities Property

\n

The total number of abilities that this hero has as max level
\n

\nOBSOLETE: No longer required to manually specify

\n
public virtual int Abilities { get; }\n
\n

Property Value

\n

System.Int32

\n

\n

ModHero.BackgroundStyle Property

\n

The other hero that has the same background color in the Heroes menu as you want to use

\n
public virtual string BackgroundStyle { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModHero.BaseTower Property

\n

The default hero (or tower) to base your hero off of

\n
public override string BaseTower { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModHero.BottomPathUpgrades Property

\n

No other upgrade paths used

\n
public sealed override int BottomPathUpgrades { get; }\n
\n

Property Value

\n

System.Int32

\n

\n

ModHero.Button Property

\n

The png name of the Button icon for this hero in the UI, by default Name-Button

\n
public virtual string Button { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModHero.ButtonReference Property

\n

The exact sprite reference used for the button

\n
public virtual SpriteReference ButtonReference { get; }\n
\n

Property Value

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference

\n

\n

ModHero.DontAddToShop Property

\n

Heroes aren't in the default shop

\n
public sealed override bool DontAddToShop { get; }\n
\n

Property Value

\n

System.Boolean

\n

\n

ModHero.GlowStyle Property

\n

The other hero that has the same glow color in the Heroes menu as you want to use

\n
public virtual string GlowStyle { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModHero.Level1Description Property

\n

The description to use for the first level of your hero

\n
public abstract string Level1Description { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModHero.MaxLevel Property

\n

The total number of levels this hero has. Do not set this to anything other than number of ModHeroLevels
\nthat you've actually created for your Hero.

\n
public virtual int MaxLevel { get; }\n
\n

Property Value

\n

System.Int32

\n

\n

ModHero.MiddlePathUpgrades Property

\n

No other upgrade paths used

\n
public sealed override int MiddlePathUpgrades { get; }\n
\n

Property Value

\n

System.Int32

\n

\n

ModHero.NameStyle Property

\n

The other hero that has the same colored name in the Heroes menu as you want to use

\n
public virtual string NameStyle { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModHero.ParagonMode Property

\n

No paragon heroes

\n
public sealed override BTD_Mod_Helper.Api.Towers.ParagonMode ParagonMode { get; }\n
\n

Property Value

\n

ParagonMode

\n

\n

ModHero.SelectScreenPortraits Property

\n

If you want to manually override which portraits your hero uses in the select screen, mess with this
\n

\nBy default will find any PortraitReferences defined in your ModHeroLevels
\n

\nThe SpriteReference is the actual image that will be displayed

\n
public virtual System.Collections.Generic.Dictionary<int,SpriteReference> SelectScreenPortraits { get; }\n
\n

Property Value

\n

System.Collections.Generic.Dictionary<System.Int32,Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference>

\n

\n

ModHero.SelectSound Property

\n

Sound to play when you select this hero in the hero select screen, the sound must be registered in the game for it to
\nplay

\n
public virtual string SelectSound { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModHero.Square Property

\n

The name of the png to try to find for the new hero select screen button

\n
public virtual string Square { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModHero.SquareReference Property

\n

The SpriteReference for this hero's Square icon in the new revamped HeroScreen

\n
public virtual SpriteReference SquareReference { get; }\n
\n

Property Value

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference

\n

\n

ModHero.Title Property

\n

The short description that appears under the name of the hero

\n
public abstract string Title { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModHero.TopPathUpgrades Property

\n

Putting all the hero level upgrades in the top path

\n
public sealed override int TopPathUpgrades { get; }\n
\n

Property Value

\n

System.Int32

\n

\n

ModHero.TowerSet Property

\n

Heroes can only be in the Hero tower set

\n
public sealed override TowerSet TowerSet { get; }\n
\n

Property Value

\n

Il2CppAssets.Scripts.Models.TowerSets.TowerSet

\n

\n

ModHero.XpRatio Property

\n

XpRatio to use when determining the default xp costs of the levels.
\n

\nAll four base heroes (Quincy, Gwendolin, Striker Jones, Obyn Greenfoot) as well as Etienne have an XP ratio of 1x.
\n

\nEzili, Pat Fusty, Admiral Brickell, and Sauda have a 1.425x XP ratio.
\n

\nBenjamin and Psi have an XP ratio of 1.5x.
\n

\nCaptain Churchill and Adora have a ratio of 1.71x.

\n
public abstract float XpRatio { get; }\n
\n

Property Value

\n

System.Single

\n

Methods

\n

\n

ModHero.CreateDefaultSkin(Dictionary<string,SkinData>) Method

\n

Creates the SkinData for the default tower

\n
public virtual SkinData CreateDefaultSkin(System.Collections.Generic.Dictionary<string,SkinData> skinsByName);\n
\n

Parameters

\n

\n

skinsByName System.Collections.Generic.Dictionary<System.String,Il2CppAssets.Scripts.Data.Skins.SkinData>

\n

Existing hero skins by their skin/tower name

\n

Returns

\n

Il2CppAssets.Scripts.Data.Skins.SkinData

\n

\n

ModHero.GetBackgroundBanner(Dictionary<string,SkinData>) Method

\n

Gets the Background Banner for the default SkinData

\n
public virtual PrefabReference GetBackgroundBanner(System.Collections.Generic.Dictionary<string,SkinData> skinsByName);\n
\n

Parameters

\n

\n

skinsByName System.Collections.Generic.Dictionary<System.String,Il2CppAssets.Scripts.Data.Skins.SkinData>

\n

Existing hero skins by their skin/tower name

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.PrefabReference

\n

\n

ModHero.GetBackgroundColor(Dictionary<string,SkinData>) Method

\n

Gets the background color for the default SkinData

\n
public virtual Color GetBackgroundColor(System.Collections.Generic.Dictionary<string,SkinData> skinsByName);\n
\n

Parameters

\n

\n

skinsByName System.Collections.Generic.Dictionary<System.String,Il2CppAssets.Scripts.Data.Skins.SkinData>

\n

Existing hero skins by their skin/tower name

\n

Returns

\n

UnityEngine.Color

\n

\n

ModHero.GetFontMaterial(Dictionary<string,SkinData>) Method

\n

Gets the font material for the default SkinData

\n
public virtual string GetFontMaterial(System.Collections.Generic.Dictionary<string,SkinData> skinsByName);\n
\n

Parameters

\n

\n

skinsByName System.Collections.Generic.Dictionary<System.String,Il2CppAssets.Scripts.Data.Skins.SkinData>

\n

Existing hero skins by their skin/tower name

\n

Returns

\n

System.String

\n

\n

ModHero.GetHeroIndex(List) Method

\n

The index to add this hero at in relation to other heroes

\n
public virtual int GetHeroIndex(System.Collections.Generic.List<HeroDetailsModel> heroSet);\n
\n

Parameters

\n

\n

heroSet System.Collections.Generic.List<Il2CppAssets.Scripts.Models.TowerSets.HeroDetailsModel>

\n

Returns

\n

System.Int32

\n

\n

ModHero.TowerTiers() Method

\n

Heroes tower tiers are always Level-0-0

\n
public sealed override System.Collections.Generic.IEnumerable<int[]> TowerTiers();\n
\n

Returns

\n

System.Collections.Generic.IEnumerable<System.Int32[]>

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Api.Towers.ModHero"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModTower.json b/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModTower.json deleted file mode 100644 index dd9a77e38..000000000 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Api.Towers.ModTower.json +++ /dev/null @@ -1 +0,0 @@ -{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Api.Towers

\n

ModTower Class

\n

Class for adding a custom Tower to the game. Use alongside ModUpgrade to define its upgrades,
\nand optionally ModTowerDisplay to define custom displays for it.

\n
public abstract class ModTower : BTD_Mod_Helper.Api.NamedModContent\n
\n

Inheritance System.ObjectModContentNamedModContent  ModTower

\n

Derived
\n↳ ModHero
\n↳ ModSubTower
\n↳ \">ModTower<T>
\n↳ ModVanillaParagon

\n

Fields

\n

\n

ModTower.MAGIC Field

\n

The string to use for the Magic tower set

\n
protected const string MAGIC = \"Magic\";\n
\n

Field Value

\n

System.String

\n

\n

ModTower.MILITARY Field

\n

The string to use for the Military tower set

\n
protected const string MILITARY = \"Military\";\n
\n

Field Value

\n

System.String

\n

\n

ModTower.PRIMARY Field

\n

The string to use for the Primary tower set

\n
protected const string PRIMARY = \"Primary\";\n
\n

Field Value

\n

System.String

\n

\n

ModTower.SUPPORT Field

\n

The string to use for the Support tower set

\n
protected const string SUPPORT = \"Support\";\n
\n

Field Value

\n

System.String

\n

Properties

\n

\n

ModTower.AlwaysIncludeInChallenge Property

\n

Whether to always make this tower be included in challenges / Bosses / Odysseys etc

\n
public virtual bool AlwaysIncludeInChallenge { get; }\n
\n

Property Value

\n

System.Boolean

\n

\n

ModTower.BaseTower Property

\n

The id of the default BTD Tower that your Tower is going to be copied from by default.

\n
public abstract string BaseTower { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModTower.BottomPathUpgrades Property

\n

The number of upgrades the tower has in it's 3rd / bottom path

\n
public virtual int BottomPathUpgrades { get; }\n
\n

Property Value

\n

System.Int32

\n

\n

ModTower.Cost Property

\n

The in game cost of this tower (on Medium difficulty)

\n
public abstract int Cost { get; }\n
\n

Property Value

\n

System.Int32

\n

\n

ModTower.DontAddToShop Property

\n

Makes this Tower not actually add itself to the shop, useful for making subtowers

\n
public virtual bool DontAddToShop { get; }\n
\n

Property Value

\n

System.Boolean

\n

\n

ModTower.Hotkey Property

\n

Hotkey to use for placing this tower from the shop

\n
public virtual BTD_Mod_Helper.Api.ModOptions.ModSettingHotkey Hotkey { get; }\n
\n

Property Value

\n

ModSettingHotkey

\n

\n

ModTower.Icon Property

\n

The Icon for the Tower's purchase button, by default \"[Name]-Icon\"
\n

\n(Name of .png or .jpg, not including file extension)

\n
public virtual string Icon { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModTower.IconReference Property

\n

If you're not going to use a custom .png for your Icon, use this to directly control its SpriteReference

\n
public virtual SpriteReference IconReference { get; }\n
\n

Property Value

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference

\n

\n

ModTower.MiddlePathUpgrades Property

\n

The number of upgrades the tower has in it's 2nd / middle path

\n
public virtual int MiddlePathUpgrades { get; }\n
\n

Property Value

\n

System.Int32

\n

\n

ModTower.ParagonMode Property

\n

Defines whether / how this ModTower has a Paragon

\n
public virtual BTD_Mod_Helper.Api.Towers.ParagonMode ParagonMode { get; }\n
\n

Property Value

\n

ParagonMode

\n

\n

ModTower.PixelsPerUnit Property

\n

For 2D towers, the ratio between pixels and display units. Higher number -> smaller tower.
\n

\n
public virtual float PixelsPerUnit { get; }\n
\n

Property Value

\n

System.Single

\n

\n

ModTower.Portrait Property

\n

The Portrait for the 0-0-0 tower, by default \"[Name]-Portrait\"
\n

\n(Name of .png or .jpg, not including file extension)

\n
public virtual string Portrait { get; }\n
\n

Property Value

\n

System.String

\n

\n

ModTower.PortraitReference Property

\n

If you're not going to use a custom .png for your Portrait, use this to directly control its SpriteReference

\n
public virtual SpriteReference PortraitReference { get; }\n
\n

Property Value

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference

\n

\n

ModTower.ShopTowerCount Property

\n

How many of this tower you can buy at once during a game. By default -1 for no limit.

\n
public virtual int ShopTowerCount { get; }\n
\n

Property Value

\n

System.Int32

\n

\n

ModTower.TopPathUpgrades Property

\n

The number of upgrades the tower has in it's 1st / top path

\n
public virtual int TopPathUpgrades { get; }\n
\n

Property Value

\n

System.Int32

\n

\n

ModTower.TowerSet Property

\n

The family of Monkeys that your Tower should be put in.
\n

\nFor now, just use one of the default constants provided of PRIMARY, MILITARY, MAGIC, or SUPPORT.

\n
public abstract TowerSet TowerSet { get; }\n
\n

Property Value

\n

Il2CppAssets.Scripts.Models.TowerSets.TowerSet

\n

\n

ModTower.Use2DModel Property

\n

Whether this Tower should display 2-dimensionally, and search for png images
\n

\n
public virtual bool Use2DModel { get; }\n
\n

Property Value

\n

System.Boolean

\n

Methods

\n

\n

ModTower.Get2DScale(int[]) Method

\n

Gets the scale to use for a 2d tower at the given tiers
\n

\n
public virtual float Get2DScale(params int[] tiers);\n
\n

Parameters

\n

\n

tiers System.Int32[]

\n

Returns

\n

System.Single

\n

\n

ModTower.Get2DTexture(int[]) Method

\n

If this is a 2D tower, gets the name of the .png to use for a given set of tiers
\n

\nDefault Behavior Example: For CardMonkey with tiers 2-3-0, it would try (in order):
\nCardMonkey-230, CardMonkey-X3X, CardMonkey-2XX, CardMonkey
\nGet2DScale(int[])

\n
public virtual string Get2DTexture(params int[] tiers);\n
\n

Parameters

\n

\n

tiers System.Int32[]

\n

Returns

\n

System.String

\n

\n

ModTower.GetBaseTowerModel(int[]) Method

\n

Allows you to change the base TowerModel your tower will use at different tiers. Note that you'd need to be
\ncareful if you entirely changed the base tower you're working with at different tiers, as it will still attempt
\nto apply all the appropriate upgrades. If you would like a ModUpgrade to only have an effect at a given tier,
\nyou could do something like:

\n
public override void ApplyUpgrade(TowerModel towerModel) {  \n    if (towerModel.tiers[Path] != Tier) return;  \n    ...  \n}  \n
\n
public virtual TowerModel GetBaseTowerModel(params int[] tiers);\n
\n

Parameters

\n

\n

tiers System.Int32[]

\n

Length 3 array of Top/Mid/Bot tiers

\n

Returns

\n

Il2CppAssets.Scripts.Models.Towers.TowerModel
\nThe base TowerModel to use

\n

\n

ModTower.GetPortraitReferenceForTiers(int[]) Method

\n

Gets the portrait reference this tower should use for the given tiers
\n

\nLooks for the highest tier ModUpgrade this tower has that defined a
\nPortraitReference,
\nfalling back to the tower's own base PortraitReference by default.

\n
public SpriteReference GetPortraitReferenceForTiers(params int[] tiers);\n
\n

Parameters

\n

\n

tiers System.Int32[]

\n

Returns

\n

Il2CppNinjaKiwi.Common.ResourceUtils.SpriteReference

\n

\n

ModTower.GetTowerIndex(List) Method

\n

When adding this tower to the shop, gets the index at which to add the tower relative to the existing ones.
\n

\nBy default, the tower will be put at the end of the TowerSet category that it's in.

\n
public virtual int GetTowerIndex(System.Collections.Generic.List<TowerDetailsModel> towerSet);\n
\n

Parameters

\n

\n

towerSet System.Collections.Generic.List<Il2CppAssets.Scripts.Models.TowerSets.TowerDetailsModel>

\n

Returns

\n

System.Int32

\n

\n

ModTower.GetUpgradePathModel(ModUpgrade, int[]) Method

\n

Creates an UpgradePathModel for a particular upgrade and new tiers

\n
public virtual UpgradePathModel GetUpgradePathModel(BTD_Mod_Helper.Api.Towers.ModUpgrade modUpgrade, int[] newTiers);\n
\n

Parameters

\n

\n

modUpgrade ModUpgrade

\n

The upgrade

\n

\n

newTiers System.Int32[]

\n

The new desired tiers of the tower

\n

Returns

\n

Il2CppAssets.Scripts.Models.Towers.Upgrades.UpgradePathModel

\n

\n

ModTower.IsUpgradePathClosed(TowerToSimulation, int, bool) Method

\n

Allows you to override whether an UpgradePath should be closed or not for a tower

\n
public virtual System.Nullable<bool> IsUpgradePathClosed(TowerToSimulation tower, int path, bool defaultClosed);\n
\n

Parameters

\n

\n

tower Il2CppAssets.Scripts.Unity.Bridge.TowerToSimulation

\n

The TowerToSimulation

\n

\n

path System.Int32

\n

What path this is for

\n

\n

defaultClosed System.Boolean

\n

Whether it'd be naturally closed or not

\n

Returns

\n

System.Nullable<System.Boolean>
\nWhether the upgrade path should be closed, or null for no change

\n

\n

ModTower.IsValidCrosspath(int[]) Method

\n

Another way to modify the allowable crosspaths for your tower. By default, checks that the highest tier is at
\nmost 5, the next highest is at most 2, and the last one is 0
\n

\nUsed in the default implementation of TowerTiers()

\n
public virtual bool IsValidCrosspath(params int[] tiers);\n
\n

Parameters

\n

\n

tiers System.Int32[]

\n

Returns

\n

System.Boolean

\n

\n

ModTower.MaxUpgradePips(TowerToSimulation, int, int) Method

\n

Allows you to override how many possible Upgrade pips it should show as being possible for a tower to get

\n
public virtual System.Nullable<int> MaxUpgradePips(TowerToSimulation tower, int path, int defaultMax);\n
\n

Parameters

\n

\n

tower Il2CppAssets.Scripts.Unity.Bridge.TowerToSimulation

\n

The TowerToSimulation

\n

\n

path System.Int32

\n

What path this is for

\n

\n

defaultMax System.Int32

\n

The default maximum

\n

Returns

\n

System.Nullable<System.Int32>
\nThe new maximum amount of upgrade pips, or null for no change

\n

\n

ModTower.ModifyBaseTowerModel(TowerModel) Method

\n

Implemented by a ModTower to modify the base tower model before applying any/all ModUpgrades
\n

\nThings like the TowerModel's name, cost, tier, and upgrades are already taken care of before this point

\n
public abstract void ModifyBaseTowerModel(TowerModel towerModel);\n
\n

Parameters

\n

\n

towerModel Il2CppAssets.Scripts.Models.Towers.TowerModel

\n

The Base Tower Model

\n

\n

ModTower.ModifyTowerModelForMatch(TowerModel, GameModel) Method

\n

Further modifies this tower when you go into a new match.
\nUseful for making conditional effects happen based on settings.
\n

\nThe normal ApplyUpgrade effects for all upgrades will have already been applied on game start,
\nso this will simply modify all the TowerModels for this ModTower.

\n
public virtual void ModifyTowerModelForMatch(TowerModel towerModel, GameModel gameModel);\n
\n

Parameters

\n

\n

towerModel Il2CppAssets.Scripts.Models.Towers.TowerModel

\n

\n

gameModel Il2CppAssets.Scripts.Models.GameModel

\n

\n

ModTower.ModifyTowerModelForMatch(TowerModel, IReadOnlyList) Method

\n

Further modifies this tower when you go into a new match.
\nUseful for making conditional effects happen based on settings.
\n

\nThe normal ApplyUpgrade effects for all upgrades will have already been applied on game start,
\nso this will simply modify all the TowerModels for this ModTower.

\n
public virtual void ModifyTowerModelForMatch(TowerModel towerModel, System.Collections.Generic.IReadOnlyList<ModModel> gameModes);\n
\n

Parameters

\n

\n

towerModel Il2CppAssets.Scripts.Models.Towers.TowerModel

\n

\n

gameModes System.Collections.Generic.IReadOnlyList<Il2CppAssets.Scripts.Models.ModModel>

\n

\n

ModTower.TowerTiers() Method

\n

Returns all the valid tiers for the TowerModels of this Tower

\n
public virtual System.Collections.Generic.IEnumerable<int[]> TowerTiers();\n
\n

Returns

\n

System.Collections.Generic.IEnumerable<System.Int32[]>

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Api.Towers.ModTower"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.AttackBehaviorExt.json b/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.AttackBehaviorExt.json deleted file mode 100644 index 86ec286c2..000000000 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.AttackBehaviorExt.json +++ /dev/null @@ -1 +0,0 @@ -{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Extensions

\n

AttackBehaviorExt Class

\n

Behavior extensions for attacks

\n
public static class AttackBehaviorExt\n
\n

Inheritance System.Object  AttackBehaviorExt

\n

Methods

\n

\n

AttackBehaviorExt.AddAttackBehavior(this Attack, T) Method

\n

Add a Behavior to this

\n
public static void AddAttackBehavior<T>(this Attack attack, T behavior)\n    where T : AttackBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to add

\n

Parameters

\n

\n

attack Il2CppAssets.Scripts.Simulation.Towers.Behaviors.Attack.Attack

\n

\n

behavior (this Attack, T).T\">T

\n

\n

AttackBehaviorExt.GetAttackBehavior(this Attack) Method

\n

Return the first Behavior of type T

\n
public static T GetAttackBehavior<T>(this Attack attack)\n    where T : AttackBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want

\n

Parameters

\n

\n

attack Il2CppAssets.Scripts.Simulation.Towers.Behaviors.Attack.Attack

\n

Returns

\n

(this Attack).T\">T

\n

\n

AttackBehaviorExt.GetAttackBehaviors(this Attack) Method

\n

Return all Behaviors of type T

\n
public static System.Collections.Generic.List<T> GetAttackBehaviors<T>(this Attack attack)\n    where T : AttackBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want

\n

Parameters

\n

\n

attack Il2CppAssets.Scripts.Simulation.Towers.Behaviors.Attack.Attack

\n

Returns

\n

System.Collections.Generic.List<(this Attack).T\">T>

\n

\n

AttackBehaviorExt.HasAttackBehavior(this Attack) Method

\n

Check if this has a specific Behavior

\n
public static bool HasAttackBehavior<T>(this Attack attack)\n    where T : AttackBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you're checking for

\n

Parameters

\n

\n

attack Il2CppAssets.Scripts.Simulation.Towers.Behaviors.Attack.Attack

\n

Returns

\n

System.Boolean

\n

\n

AttackBehaviorExt.RemoveAttackBehavior(this Attack, T) Method

\n

Remove the first Behavior of type T

\n
public static void RemoveAttackBehavior<T>(this Attack attack, T behavior)\n    where T : AttackBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to remove

\n

Parameters

\n

\n

attack Il2CppAssets.Scripts.Simulation.Towers.Behaviors.Attack.Attack

\n

\n

behavior (this Attack, T).T\">T

\n

\n

AttackBehaviorExt.RemoveAttackBehavior(this Attack) Method

\n

Remove the first Behavior of Type T

\n
public static void RemoveAttackBehavior<T>(this Attack attack)\n    where T : AttackBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to remove

\n

Parameters

\n

\n

attack Il2CppAssets.Scripts.Simulation.Towers.Behaviors.Attack.Attack

\n

\n

AttackBehaviorExt.RemoveAttackBehaviors(this Attack) Method

\n

Remove all Behaviors of type T

\n
public static void RemoveAttackBehaviors<T>(this Attack attack)\n    where T : AttackBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to remove

\n

Parameters

\n

\n

attack Il2CppAssets.Scripts.Simulation.Towers.Behaviors.Attack.Attack

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Extensions.AttackBehaviorExt"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppSystemDictionaryExt.json b/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppSystemDictionaryExt.json deleted file mode 100644 index 2997eaf51..000000000 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.Il2CppSystemDictionaryExt.json +++ /dev/null @@ -1 +0,0 @@ -{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Extensions

\n

Il2CppSystemDictionaryExt Class

\n

Extensions for il2cpp dictionaries

\n
public static class Il2CppSystemDictionaryExt\n
\n

Inheritance System.Object  Il2CppSystemDictionaryExt

\n

Methods

\n

\n

Il2CppSystemDictionaryExt.Deconstruct<K,V>(this KeyValuePair<K,V>, K, V) Method

\n

Deconstruct method of IL2CPP KeyValuePairs

\n
public static void Deconstruct<K,V>(this KeyValuePair<K,V> kvp, out K k, out V v);\n
\n

Type parameters

\n

\n

K

\n

\n

V

\n

Parameters

\n

\n

kvp Il2CppSystem.Collections.Generic.KeyValuePair

\n

\n

k (this KeyValuePair, K, V).K\">K

\n

\n

v (this KeyValuePair, K, V).V\">V

\n

\n

Il2CppSystemDictionaryExt.GetValues<TKey,TValue>(this Dictionary<TKey,TValue>) Method

\n

Get all of the values from this Dictionary as a list

\n
public static List<TValue> GetValues<TKey,TValue>(this Dictionary<TKey,TValue> keyValuePairs);\n
\n

Type parameters

\n

\n

TKey

\n

\n

TValue

\n

Parameters

\n

\n

keyValuePairs Il2CppSystem.Collections.Generic.Dictionary

\n

Returns

\n

Il2CppSystem.Collections.Generic.List

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Extensions.Il2CppSystemDictionaryExt"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ProjectileBehaviorExt.json b/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ProjectileBehaviorExt.json deleted file mode 100644 index 302f1fa5e..000000000 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.ProjectileBehaviorExt.json +++ /dev/null @@ -1 +0,0 @@ -{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Extensions

\n

ProjectileBehaviorExt Class

\n

Behavior extensions for projectiles

\n
public static class ProjectileBehaviorExt\n
\n

Inheritance System.Object  ProjectileBehaviorExt

\n

Methods

\n

\n

ProjectileBehaviorExt.AddProjectileBehavior(this Projectile, T) Method

\n

Add a Behavior to this

\n
public static void AddProjectileBehavior<T>(this Projectile projectile, T behavior)\n    where T : ProjectileBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

projectile Il2CppAssets.Scripts.Simulation.Towers.Projectiles.Projectile

\n

\n

behavior (this Projectile, T).T\">T

\n

\n

ProjectileBehaviorExt.GetProjectileBehavior(this Projectile) Method

\n

Return the first Behavior of type T

\n
public static T GetProjectileBehavior<T>(this Projectile projectile)\n    where T : ProjectileBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

projectile Il2CppAssets.Scripts.Simulation.Towers.Projectiles.Projectile

\n

Returns

\n

(this Projectile).T\">T

\n

\n

ProjectileBehaviorExt.GetProjectileBehaviors(this Projectile) Method

\n

Return all Behaviors of type T

\n
public static System.Collections.Generic.List<T> GetProjectileBehaviors<T>(this Projectile projectile)\n    where T : ProjectileBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

projectile Il2CppAssets.Scripts.Simulation.Towers.Projectiles.Projectile

\n

Returns

\n

System.Collections.Generic.List<(this Projectile).T\">T>

\n

\n

ProjectileBehaviorExt.HasProjectileBehavior(this Projectile) Method

\n

Check if this has a specific Behavior

\n
public static bool HasProjectileBehavior<T>(this Projectile projectile)\n    where T : ProjectileBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

projectile Il2CppAssets.Scripts.Simulation.Towers.Projectiles.Projectile

\n

Returns

\n

System.Boolean

\n

\n

ProjectileBehaviorExt.RemoveProjectileBehavior(this Projectile, T) Method

\n

Remove the first Behavior of type T

\n
public static void RemoveProjectileBehavior<T>(this Projectile projectile, T behavior)\n    where T : ProjectileBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

projectile Il2CppAssets.Scripts.Simulation.Towers.Projectiles.Projectile

\n

\n

behavior (this Projectile, T).T\">T

\n

\n

ProjectileBehaviorExt.RemoveProjectileBehavior(this Projectile) Method

\n

Remove the first Behavior of Type T

\n
public static void RemoveProjectileBehavior<T>(this Projectile projectile)\n    where T : ProjectileBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

projectile Il2CppAssets.Scripts.Simulation.Towers.Projectiles.Projectile

\n

\n

ProjectileBehaviorExt.RemoveProjectileBehaviors(this Projectile) Method

\n

Remove all Behaviors of type T

\n
public static void RemoveProjectileBehaviors<T>(this Projectile projectile)\n    where T : ProjectileBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

projectile Il2CppAssets.Scripts.Simulation.Towers.Projectiles.Projectile

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Extensions.ProjectileBehaviorExt"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.RootObjectLockList.json b/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.RootObjectLockList.json deleted file mode 100644 index b5c97de44..000000000 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.RootObjectLockList.json +++ /dev/null @@ -1 +0,0 @@ -{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Extensions

\n

RootObjectLockList Class

\n

Extensions for RootObjectLockLists

\n
public static class RootObjectLockList\n
\n

Inheritance System.Object  RootObjectLockList

\n

Methods

\n

\n

RootObjectLockList.AddTo<TSource,TCast>(this RootObjectLockList, TCast) Method

\n

Return this with an additional Item added to it

\n
public static RootObjectLockList<TSource> AddTo<TSource,TCast>(this RootObjectLockList<TSource> lockList, TCast objectToAdd)\n    where TSource : RootObject\n    where TCast : RootObject;\n
\n

Type parameters

\n

\n

TSource

\n

\n

TCast

\n

The Type of the Item to add

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

\n

objectToAdd (this RootObjectLockList, TCast).TCast\">TCast

\n

Item to add

\n

Returns

\n

Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

\n

RootObjectLockList.Duplicate(this RootObjectLockList) Method

\n

Return a duplicate of this

\n
public static RootObjectLockList<T> Duplicate<T>(this RootObjectLockList<T> list)\n    where T : RootObject;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

list Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

Returns

\n

Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

\n

RootObjectLockList.DuplicateAs<TSource,TCast>(this RootObjectLockList) Method

\n

Return a duplicate of this as type TCast

\n
public static RootObjectLockList<TCast> DuplicateAs<TSource,TCast>(this RootObjectLockList<TSource> list)\n    where TSource : RootObject\n    where TCast : RootObject;\n
\n

Type parameters

\n

\n

TSource

\n

\n

TCast

\n

Parameters

\n

\n

list Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

Returns

\n

Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

\n

RootObjectLockList.GetItemOfType<TSource,TCast>(this RootObjectLockList) Method

\n
public static TCast GetItemOfType<TSource,TCast>(this RootObjectLockList<TSource> lockList)\n    where TSource : RootObject\n    where TCast : RootObject;\n
\n

Type parameters

\n

\n

TSource

\n

\n

TCast

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

Returns

\n

(this RootObjectLockList).TCast\">TCast

\n

\n

RootObjectLockList.GetItemsOfType<TSource,TCast>(this RootObjectLockList) Method

\n

Return all Items of type TCast

\n
public static System.Collections.Generic.List<TCast> GetItemsOfType<TSource,TCast>(this RootObjectLockList<TSource> lockList)\n    where TSource : RootObject\n    where TCast : RootObject;\n
\n

Type parameters

\n

\n

TSource

\n

\n

TCast

\n

The Type of the Items you want

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

Returns

\n

System.Collections.Generic.List<(this RootObjectLockList).TCast\">TCast>

\n

\n

RootObjectLockList.HasItemsOfType<TSource,TCast>(this RootObjectLockList) Method

\n

Check if this has any items of type TCast

\n
public static bool HasItemsOfType<TSource,TCast>(this RootObjectLockList<TSource> lockList)\n    where TSource : RootObject\n    where TCast : RootObject;\n
\n

Type parameters

\n

\n

TSource

\n

\n

TCast

\n

The Type you're checking for

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

Returns

\n

System.Boolean

\n

\n

RootObjectLockList.RemoveItem<TSource,TCast>(this RootObjectLockList, TCast) Method

\n

Return this with the first Item of type TCast removed

\n
public static RootObjectLockList<TSource> RemoveItem<TSource,TCast>(this RootObjectLockList<TSource> lockList, TCast itemToRemove)\n    where TSource : RootObject\n    where TCast : RootObject;\n
\n

Type parameters

\n

\n

TSource

\n

\n

TCast

\n

The Type of the Item you want to remove

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

\n

itemToRemove (this RootObjectLockList, TCast).TCast\">TCast

\n

The specific Item to remove

\n

Returns

\n

Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

\n

RootObjectLockList.RemoveItemOfType<TSource,TCast>(this RootObjectLockList) Method

\n

Return this with the first Item of type TCast removed

\n
public static RootObjectLockList<TSource> RemoveItemOfType<TSource,TCast>(this RootObjectLockList<TSource> lockList)\n    where TSource : RootObject\n    where TCast : RootObject;\n
\n

Type parameters

\n

\n

TSource

\n

\n

TCast

\n

The Type of the Item you want to remove

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

Returns

\n

Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

\n

RootObjectLockList.RemoveItemsOfType<TSource,TCast>(this RootObjectLockList) Method

\n

Return this with all Items of type TCast removed

\n
public static RootObjectLockList<TSource> RemoveItemsOfType<TSource,TCast>(this RootObjectLockList<TSource> lockList)\n    where TSource : RootObject\n    where TCast : RootObject;\n
\n

Type parameters

\n

\n

TSource

\n

\n

TCast

\n

The Type of the Items that you want to remove

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

Returns

\n

Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

\n

RootObjectLockList.ToArray(this RootObjectLockList) Method

\n

Return as System.Array

\n
public static T[] ToArray<T>(this RootObjectLockList<T> lockList)\n    where T : RootObject;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

Returns

\n

(this RootObjectLockList).T\">T[]

\n

\n

RootObjectLockList.ToIl2CppList(this RootObjectLockList) Method

\n

Return as Il2CppSystem.List

\n
public static List<T> ToIl2CppList<T>(this RootObjectLockList<T> lockList)\n    where T : RootObject;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

Returns

\n

Il2CppSystem.Collections.Generic.List

\n

\n

RootObjectLockList.ToIl2CppReferenceArray(this RootObjectLockList) Method

\n

Return as Il2CppReferenceArray

\n
public static Il2CppReferenceArray<T> ToIl2CppReferenceArray<T>(this RootObjectLockList<T> lockList)\n    where T : RootObject;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

Returns

\n

Il2CppInterop.Runtime.InteropTypes.Arrays.Il2CppReferenceArray

\n

\n

RootObjectLockList.ToList(this RootObjectLockList) Method

\n

Return as System.List

\n
public static System.Collections.Generic.List<T> ToList<T>(this RootObjectLockList<T> lockList)\n    where T : RootObject;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

lockList Il2CppAssets.Scripts.Simulation.Objects.RootObjectLockList

\n

Returns

\n

System.Collections.Generic.List<(this RootObjectLockList).T\">T>

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Extensions.RootObjectLockList"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.StringExt.json b/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.StringExt.json deleted file mode 100644 index a5e5b5561..000000000 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.StringExt.json +++ /dev/null @@ -1 +0,0 @@ -{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Extensions

\n

StringExt Class

\n

Extensions for strings

\n
public static class StringExt\n
\n

Inheritance System.Object  StringExt

\n

Methods

\n

\n

StringExt.GetBtd6Localization(this string, bool) Method

\n

Gets the localization from the current localization text table, or the default one if it's not present in the current one.
\nIf the id is not present in any of these, returned as spaced or not spaced depending on parameters.

\n
public static string GetBtd6Localization(this string id, bool returnAsSpacedIfNoEntry=true);\n
\n

Parameters

\n

\n

id System.String

\n

The ID of the thing you're trying to get the localization of.

\n

\n

returnAsSpacedIfNoEntry System.Boolean

\n

Should this return the id with spaces if there's no localization present?

\n

Returns

\n

System.String

\n

\n

StringExt.NullIfEmpty(this string) Method

\n

Returns null if a string is empty / whitespace, otherwise just returns back the string

\n
public static string NullIfEmpty(this string s);\n
\n

Parameters

\n

\n

s System.String

\n

Returns

\n

System.String

\n

\n

StringExt.RegexReplace(this string, string, string) Method

\n\n
public static string RegexReplace(this string input, string pattern, string replacement);\n
\n

Parameters

\n

\n

input System.String

\n

\n

pattern System.String

\n

\n

replacement System.String

\n

Returns

\n

System.String

\n

\n

StringExt.Spaced(this string) Method

\n

Puts spaces between capitalized words within a string

\n
public static string Spaced(this string s);\n
\n

Parameters

\n

\n

s System.String

\n

Returns

\n

System.String

\n

\n

StringExt.ToTitleCase(this string) Method

\n\n
public static string ToTitleCase(this string input);\n
\n

Parameters

\n

\n

input System.String

\n

Returns

\n

System.String

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Extensions.StringExt"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.TowerBehaviorExt.json b/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.TowerBehaviorExt.json deleted file mode 100644 index 2fb6c464f..000000000 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.TowerBehaviorExt.json +++ /dev/null @@ -1 +0,0 @@ -{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Extensions

\n

TowerBehaviorExt Class

\n

Behavior extensions for Towers

\n
public static class TowerBehaviorExt\n
\n

Inheritance System.Object  TowerBehaviorExt

\n

Methods

\n

\n

TowerBehaviorExt.AddTowerBehavior(this Tower, T) Method

\n

Add a Behavior to this

\n
public static void AddTowerBehavior<T>(this Tower tower, T behavior)\n    where T : TowerBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

tower Il2CppAssets.Scripts.Simulation.Towers.Tower

\n

\n

behavior (this Tower, T).T\">T

\n

\n

TowerBehaviorExt.GetTowerBehavior(this Tower) Method

\n

Return the first Behavior of type T

\n
public static T GetTowerBehavior<T>(this Tower tower)\n    where T : TowerBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

tower Il2CppAssets.Scripts.Simulation.Towers.Tower

\n

Returns

\n

(this Tower).T\">T

\n

\n

TowerBehaviorExt.GetTowerBehaviors(this Tower) Method

\n

Return all Behaviors of type T

\n
public static System.Collections.Generic.List<T> GetTowerBehaviors<T>(this Tower tower)\n    where T : TowerBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

tower Il2CppAssets.Scripts.Simulation.Towers.Tower

\n

Returns

\n

System.Collections.Generic.List<(this Tower).T\">T>

\n

\n

TowerBehaviorExt.HasTowerBehavior(this Tower) Method

\n

Check if this has a specific Behavior

\n
public static bool HasTowerBehavior<T>(this Tower tower)\n    where T : TowerBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

tower Il2CppAssets.Scripts.Simulation.Towers.Tower

\n

Returns

\n

System.Boolean

\n

\n

TowerBehaviorExt.RemoveTowerBehavior(this Tower, T) Method

\n

Remove the first Behavior of type T

\n
public static void RemoveTowerBehavior<T>(this Tower tower, T behavior)\n    where T : TowerBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

tower Il2CppAssets.Scripts.Simulation.Towers.Tower

\n

\n

behavior (this Tower, T).T\">T

\n

\n

TowerBehaviorExt.RemoveTowerBehavior(this Tower) Method

\n

Remove the first Behavior of Type T

\n
public static void RemoveTowerBehavior<T>(this Tower tower)\n    where T : TowerBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

tower Il2CppAssets.Scripts.Simulation.Towers.Tower

\n

\n

TowerBehaviorExt.RemoveTowerBehaviors(this Tower) Method

\n

Remove all Behaviors of type T

\n
public static void RemoveTowerBehaviors<T>(this Tower tower)\n    where T : TowerBehavior;\n
\n

Type parameters

\n

\n

T

\n

Parameters

\n

\n

tower Il2CppAssets.Scripts.Simulation.Towers.Tower

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Extensions.TowerBehaviorExt"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.WeaponBehaviorExt.json b/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.WeaponBehaviorExt.json deleted file mode 100644 index 9c800bbb9..000000000 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/BTD_Mod_Helper.Extensions.WeaponBehaviorExt.json +++ /dev/null @@ -1 +0,0 @@ -{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BTD_Mod_Helper.Extensions

\n

WeaponBehaviorExt Class

\n

Behavior extensions for Weapons

\n
public static class WeaponBehaviorExt\n
\n

Inheritance System.Object  WeaponBehaviorExt

\n

Methods

\n

\n

WeaponBehaviorExt.AddWeaponBehavior(this Weapon, T) Method

\n

Add a Behavior to this

\n
public static void AddWeaponBehavior<T>(this Weapon weapon, T behavior)\n    where T : WeaponBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to add

\n

Parameters

\n

\n

weapon Il2CppAssets.Scripts.Simulation.Towers.Weapons.Weapon

\n

\n

behavior (this Weapon, T).T\">T

\n

\n

WeaponBehaviorExt.GetWeaponBehavior(this Weapon) Method

\n

Return the first Behavior of type T

\n
public static T GetWeaponBehavior<T>(this Weapon weapon)\n    where T : WeaponBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want

\n

Parameters

\n

\n

weapon Il2CppAssets.Scripts.Simulation.Towers.Weapons.Weapon

\n

Returns

\n

(this Weapon).T\">T

\n

\n

WeaponBehaviorExt.GetWeaponBehaviors(this Weapon) Method

\n

Return all Behaviors of type T

\n
public static System.Collections.Generic.List<T> GetWeaponBehaviors<T>(this Weapon weapon)\n    where T : WeaponBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want

\n

Parameters

\n

\n

weapon Il2CppAssets.Scripts.Simulation.Towers.Weapons.Weapon

\n

Returns

\n

System.Collections.Generic.List<(this Weapon).T\">T>

\n

\n

WeaponBehaviorExt.HasWeaponBehavior(this Weapon) Method

\n

Check if this has a specific Behavior

\n
public static bool HasWeaponBehavior<T>(this Weapon weapon)\n    where T : WeaponBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you're checking for

\n

Parameters

\n

\n

weapon Il2CppAssets.Scripts.Simulation.Towers.Weapons.Weapon

\n

Returns

\n

System.Boolean

\n

\n

WeaponBehaviorExt.RemoveWeaponBehavior(this Weapon, T) Method

\n

Remove the first Behavior of type T

\n
public static void RemoveWeaponBehavior<T>(this Weapon weapon, T behavior)\n    where T : WeaponBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to remove

\n

Parameters

\n

\n

weapon Il2CppAssets.Scripts.Simulation.Towers.Weapons.Weapon

\n

\n

behavior (this Weapon, T).T\">T

\n

\n

WeaponBehaviorExt.RemoveWeaponBehavior(this Weapon) Method

\n

Remove the first Behavior of Type T

\n
public static void RemoveWeaponBehavior<T>(this Weapon weapon)\n    where T : WeaponBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to remove

\n

Parameters

\n

\n

weapon Il2CppAssets.Scripts.Simulation.Towers.Weapons.Weapon

\n

\n

WeaponBehaviorExt.RemoveWeaponBehaviors(this Weapon) Method

\n

Remove all Behaviors of type T

\n
public static void RemoveWeaponBehaviors<T>(this Weapon weapon)\n    where T : WeaponBehavior;\n
\n

Type parameters

\n

\n

T

\n

The Behavior you want to remove

\n

Parameters

\n

\n

weapon Il2CppAssets.Scripts.Simulation.Towers.Weapons.Weapon

","tableOfContentsHtml":"","title":"BTD_Mod_Helper.Extensions.WeaponBehaviorExt"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/README.json b/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/README.json deleted file mode 100644 index 24907dd35..000000000 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/docs/README.json +++ /dev/null @@ -1 +0,0 @@ -{"pageProps":{"data":{"contentHtml":"

BloonsTD6 Mod Helper

\n

BloonsTD6 Mod Helper Assembly

\n

Namespaces

\n

\n

BTD_Mod_Helper Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
BloonsModExpanded version of MelonMod to suit the needs of BTD Mod Helper
BloonsTD6ModExtend this Class instead of MelonMod to gain access to dozens of easy to use built-in hooks
ModHelperCatch-all class for non-extension static methods
\n

\n

BTD_Mod_Helper.Api Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
AnimationsClass to statically store RuntimeAnimationControllers for different animations
FontsClass to statically store TMP_FontAsset for different fonts
ModByteLoaderA class that can be generated by your mod in order to statically load a big complex Model object in your mod, like
Ninja Kiwi does with the whole GameModel
\">ModByteLoader<T>A class that can be generated by your mod in order to statically load a big complex Model object in your mod, like
Ninja Kiwi does with the whole GameModel
ModContentModContent serves two major purposes:


1. It is a base class for things that needs to be loaded via reflection from mods and given Ids,
such as ModTower and ModUpgrade


2. It is a utility class with methods to access instances of those classes and other resources
ModGameMenuClass for a custom BTD6 menu
\">ModGameMenu<T>Generic class for creating a ModGameMenu with the given type as it's base menu
ModLoadTaskClass for a Coroutine style task that runs during the BTD6 loading screen
ModMenuDataClass to be passed in to the Open methods of Screens
MoreAccessToolsFurther methods along the lines of Harmony's HarmonyLib.AccessTools
NamedModContentModContent with DisplayName and Description that registers values in the LocalizationManger's textTable
TaskSchedulerClass for scheduling Tasks using MelonCoroutines
\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Interfaces
IModContentDummy interface to unite ModContent and BloonsTD6Mod
\n

\n

BTD_Mod_Helper.Api.Bloons Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
BloonModelUtilsProvides Utility methods for dealing with BloonModels
ModBloonClass for adding in a new Bloon to the game
\">ModBloon<T>Class for a ModBloon which has a different ModBloon as its base
ModRoundSetClass for a custom RoundSet
ModVanillaBloonAllows you to easily modify the models of a specific vanilla Bloon
ModVanillaBloonsAllows you to easily modify the models of multiple vanilla Bloons
\n

\n

BTD_Mod_Helper.Api.Components Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
MatchLocalPositionComponent to make this transform continuously match the position of another transform
ModGameMenuTrackerComponent to track that a instance of a GameMenu's gameObject actually is the same ModGameMenu as was opened,
as direct comparison on the Unity Objects does not work reliably
ModHelperButtonModHelperComponent for a background panel
ModHelperCategoryModHelperComponent for a category in the mod settings menu
ModHelperCheckboxModHelperComponent for a Checkbox
ModHelperComponentBase for a helper component for making custom UIs in the same style as Vanilla ones
ModHelperComponentExtExtensions for mod helper components, for using generics and based on restricts for il2cpp objects
ModHelperDropdownModHelperComponent for a
ModHelperImageModHelperComponent for a
ModHelperInputFieldModHelperComponent for a text input field
ModHelperOptionModHelperComponent that's the base panel for the visual representation of a ModSetting
ModHelperPanelModHelperComponent for a background panel
ModHelperScrollPanelModHelperComponent for a background panel
ModHelperSliderModHelperComponent for a sliding input
ModHelperTextModHelperComponent for a background panel
ScaleOverrideCustom component to keep the scale of a transform permanently at 0, even if an Animator tries to change it
\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Structs
InfoStruct used to represent the name, position and size information of a ModHelperComponent
\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Enums
InfoPresetSpecific common preset setups of Info structs
\n

\n

BTD_Mod_Helper.Api.Coop Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
MessageUtilsUtility functions used for sending messages over the network.
\n

\n

BTD_Mod_Helper.Api.Data Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
ModMultiTextOverrideA bunch of ModTextOverrides that all share the same Active condition and don't require any on the fly determinations of
their text
ModSettingsAnother class outside of the main BloonsTD6Mod class that ModSettings can be defined in. Rules otherwise work the same
way
ModTextOverrideClass for dynamically overriding In-Game text in a way that's compatible with other mods
\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Interfaces
IModSettingsInterface to signify that BTD_Mod_Helper.Api.ModOptions.ModSettingsHandler.CreateModSettings(BTD_Mod_Helper.Api.Data.IModSettings,BTD_Mod_Helper.BloonsMod) should be called on this type
\n

\n

BTD_Mod_Helper.Api.Display Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
ModBloonCustomDisplayA ModCustomDisplay that will automatically apply to a ModBloon
\">ModBloonCustomDisplay<T>A ModCustomDisplay that will automatically apply to a ModBloon
ModBloonDisplayA ModDisplay that will automatically apply to a ModBloon
\">ModBloonDisplay<T>A convenient generic class for applying a ModBloonDisplay to a ModBloon
ModBuffIconClass for adding a new buff icon that can be displayed for towers
ModCustomDisplayThe custom version of a ModDisplay that loads in a model from a unity assetbundle
ModDisplayA custom Display that is a copy of an existing Display that can be modified
ModDisplay2DMod Display specifically set up to be a 2d image
ModTowerCustomDisplayA ModCustomDisplay that will automatically apply to a ModTower for specific tiers
\">ModTowerCustomDisplay<T>A convenient generic class for applying a ModTowerCustomDisplay to a ModTower
ModTowerDisplayA ModDisplay that will automatically apply to a ModTower for specific tiers
\">ModTowerDisplay<T>A convenient generic class for applying a ModTowerDisplay to a ModTower
\n

\n

BTD_Mod_Helper.Api.Enums Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
RoundSetTypeIn game IDs for the round sets included in BTD6
TowerSetTypeEnum-like class for the different tower set types
\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Enums
ScheduleTypeControls how you want to wait the Task Scheduler to wait for your tasks
\n

\n

BTD_Mod_Helper.Api.Helpers Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
AbilityHelperA wrapper around AbilityModels for making them easier to create
ActionHelperClass for converting actions and functions
AttackHelperA wrapper around AttackModels for making them easier to create
CostHelperHelper for scaling costs to difficulties
FileDialogHelperClass to help with the usage of Native File Dialogs
FileIOHelperClass replacing the original functionality of FileIOUtil before BTD6 update 33.0
GameModelExporterClass for handily exporting elements of the GameModel to json files
InstancesProvides quick access to many major BTD6 singleton classes
ListsProvides quick access to many major BTD6 object lists
MapHelperContains helper methods for working with maps and custom maps.
MatchScaleComponent to make this transform continuously match the scale of another transform
ModelHelperA wrapper class around a Model
\">ModelHelper<T>A wrapper class around a Model
ProcessHelperHelper methods for processes
ProjectileHelperA wrapper around ProjectileModels for making them easier to create
WeaponHelperA wrapper around WeaponModels for making them easier to create
\n

\n

BTD_Mod_Helper.Api.ModMenu Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
ModHelperHttpHttp client used by the mod helper
\n

\n

BTD_Mod_Helper.Api.ModOptions Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
ModSettingBase class for a ModSetting without the generics
\">ModSetting<T>Class for keeping track of a variable for a Mod that can be changed in game via the Mod Settings menu
ModSettingBoolModSetting class for a boolean value
ModSettingButtonModSetting for adding a button in the settings that performs a given action, with the setting just tracking
the number of times that the button has been pressed.
ModSettingCategoryCategory of mod settings
ModSettingDoubleModSetting for a decimal value
\">ModSettingEnum<T>ModSetting for an Enum value
ModSettingFileModSetting for selecting a specific file on the host computer
ModSettingFloatAlias for ModSettingDouble
ModSettingFolderModSetting for selecting a specific folder on the host computer
ModSettingHotkeyModSetting for a customizable Hotkey
ModSettingIntModSetting for int values
\">ModSettingNumber<T>ModSetting class for a number, implying it can have a min/max value, and be an input or a slider
ModSettingStringModSetting for a string value
\n

\n

BTD_Mod_Helper.Api.Scenarios Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
ModGameModeClass for a custom GameMode that will be added to the modes screen when starting a new match
\n

\n

BTD_Mod_Helper.Api.Towers Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
ModHeroClass for adding a custom Hero to the game. Use alongside ModHeroLevel to give multiple levels.
ModHeroLevelClass representing the UpgradeModel and changes for a particular Level for a ModHero
\">ModHeroLevel<T>Convenient generic class for specifying the ModHero that this ModHeroLevel is for
ModParagonUpgradeDefines the Paragon Upgrade for a ModTower. Remember to set the ParagonMode property.
\">ModParagonUpgrade<T>A convenient generic class for specifying the ModTower that this ModParagonUpgrade is for
ModSubTowerHelper class for making a subtower
\">ModSubTower<T>Helper class for making a subtower for a specific other ModTower
ModTowerClass for adding a custom Tower to the game. Use alongside ModUpgrade to define its upgrades,
and optionally ModTowerDisplay to define custom displays for it.
\">ModTower<T>A convenient generic class for specifying the ModTowerSet that a ModTower uses
ModTowerHelperClass with helper methods for TowerModels / ModTowers


Mostly used internally
ModTowerSetA custom collection of ModTowers
ModUpgradeA class used to create an Upgrade for a Tower
\">ModUpgrade<T>A convenient generic class for specifying the ModTower that this ModUpgrade is for
ModVanillaContentClass for changing Vanilla content within the game
\">ModVanillaContent<T>ModContent Class for modifying a certain set of vanilla towers
ModVanillaParagonDummy ModTower that can be used to make a Paragon for a base tower.
ModVanillaTowerModContent class for modifying all TowerModels for a given Tower
\">ModVanillaTower<T>Helper class for changing a vanilla tower to be part of a modded tower set
ModVanillaUpgradeModContent class for modifying all TowerModels that have a given upgrade applied to them
\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Enums
ParagonModeDefines the Paragon behavior for a ModTower
\n

\n

BTD_Mod_Helper.Extensions Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
AbilityModelBehaviorExtExtensions for AbilityModels
AbilityModelExtExtensions for AbilityModels
ActionExtExtension methods for System.Action
AddBehaviorToBloonModelExtExtensions for AddBehaviorToBloonModels
AirUnitModelBehaviorExtBehavior extensions for AirUnitModels
ArrayExtExtensions for arrays
AssemblyExtExtensions for Assemblies
AttackBehaviorExtBehavior extensions for attacks
AttackModelBehaviorExtBehavior Extensions for AttackModel
AttackModelExtExtensions for AttackModels
AudioClipExtensionsExtensions for unity audio clips
BloonBehaviorExtExtensions for getting bloon behaviors
BloonExtExtensions for Bloons
BloonModelBehaviorExtBehavior extensions for BloonModels
BloonModelExtExtensions for BloonModels
BloonsTD6ModExtExtensions for BloonsTD6Mods (for some reason lol)
BloonToSimulationExtExtensions for the BloonToSimulation
ButtonClickedEventExtExtensions for ButtonClickedEvents
ButtonExtExtensions for Buttons
ComponentExtExtensions for Component
DeconstructExtAdding more deconstruct methods to things
DictionaryExtExtensions for normal System Dictionaries
DirectoryInfoExtExtensions for DirectoryInfo
DisplayModelExtExtensions for DisplayModel
DumpNodeExtExtension for dumping textures from UnityDisplayNodes
EmissionModelBehaviorExtExtensions for EmissionModels
EntityBehaviorExtBehavior extensions for Entities
EntityExtExtensions for Entities
FileInfoExtExtensions for FileInfo
FunctionExtExtensions for Functions
GameExtExtensions for Game
GameModelExtExtensions for the GameModel
GameObjectExtExtensions for GameObjects
GrowModelExtExtension methods for Il2CppAssets.Scripts.Models.Bloons.Behaviors.GrowModel.
HarmonyExtExtensions for Harmony stuff
IEnumerableExtExtensions for the normal System IEnumerable class
Il2CppGenericIEnumerableExtensions for Il2cpp Ienumerables
Il2CppGenericIEnumerableExtExtensions for il2cpp ienumerables
Il2CppGenericsExtensions for il2cpp lists
Il2CppGenericsExtExtensions for generic il2cpp lists
Il2CppIEnumeratorExtensions for il2cpp ienumerators
Il2CppIEnumeratorExtExtensions for Il2cpp Ienumerators
Il2CppReferenceArrayExtensions for il2cpp reference arrays
Il2CppReferenceArrayExtExtensions for Il2CppReferenceArrays
Il2CppStringArrayExtExtension methods for Il2CppStringArrays
Il2CppSystemDelegateExxtExtensions for Il2cpp delegates
Il2CppSystemDictionaryExtExtensions for il2cpp dictionaries
Il2CppSystemObjectExtExtensions for Il2cpp objects
ImageExtExtensions for Images
InGameExtExtensions for the InGame class
InputFieldExtExtensions for InputFields
InputFieldOnValueChangedExtension for OnChangeEvent
InputFieldSubmitEventExtensions for InputFieldSubmitEvents
LayoutGroupExtExtensions for LayoutGroups
ListExtExtensions for non il2cpp Lists
LocalizationManagerExtExtension methods for the Localization Manager.
LockedListExtensions for LockedLists
LockedListExtExtensions for LockLists
MapExtExtensions for Maps
MiscModelExtOther miscellaneous extensions for various Model classes
ModelExtExtensions for Models
ModModelExtExtensions for the ModModel (GameMode) class
NK_TextMeshProUGUIExtExtensions for NK_TextMeshProUGuis
NKMultiGameInterfaceExtExtensions for sending and receiving data in coop
PetModelBehaviorExtExtensions for PetModels
PopupScreenExtExtensions for PopupScreen
PowerModelBehaviorExtBehavior extensions for PowerModels
ProfileModelExtExtensions for ProfileModels
ProjectileBehaviorExtBehavior extensions for projectiles
ProjectileExtExtensions for Projectiles
ProjectileModelBehaviorExtBehavior Extensions for ProjectileModels
ProjectileModelExtExtensions for ProjectileModels
RendererExtExtensions for unity renderers
RootObjectLockListExtensions for RootObjectLockLists
RoundModelExtExtensions for RoundModels
SelectableObjectExtExtensions for Selectable Objects
SliderEventExtExtensions for SliderEvents
SpawnerExtExtensions for Spawners
SpriteExtExtensions for Sprites
SpriteReferenceExtExtensions for SpriteReferences
StandardTowerPurchaseButtonExtExtensions for StandardTowerPurchaseButtons
StreamExtExtensions for streams
StringExtExtensions for strings
SupportModelExtExtension methods for support models
Texture2DExtExtensions for Texture2Ds
ToggleEventExtExtensions for ToggleEvents
ToggleExtExtensions for Toggles
TowerBehaviorExtBehavior extensions for Towers
TowerDetailsModelExtExtensions for TowerDetailsModels
TowerExtExtensions for Towers
TowerModelBehaviorExtBehavior extensions for TowerModels
TowerModelExtExtensions for TowerModels
TowerToSimulationExtExtensions for TowerToSimulation
TypeExtExtensions for Type
UnityDisplayNodeExtExtensions for UnityDisplayNodes
UpgradeModelExtExtensions for UpgradeModels
Vector3ExtExtensions for Vectors
WeaponBehaviorExtBehavior extensions for Weapons
WeaponModelBehaviorExtBehavior extensions for WeaponModels
WeaponModelExtExtensions for WeaponModels
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Delegates
Function()
()\">Function<T>()
InputFieldOnValueChanged.Function(string)Represents a multicast delegate; that is, a delegate that can have more than one element in its invocation list.
InputFieldSubmitEvent.Function(string)Represents a multicast delegate; that is, a delegate that can have more than one element in its invocation list.
SliderEventExt.Function(float)Represents a multicast delegate; that is, a delegate that can have more than one element in its invocation list.
ToggleEventExt.Function(bool)Represents a multicast delegate; that is, a delegate that can have more than one element in its invocation list.
\n

\n

BTD_Mod_Helper.UI.BTD6 Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
MainMenuUIClass to access the game's Main Menu UI
MapSelectUIClass to access the game's Map Select UI
TitleScreenUIClass to access the Title Screen UI
\n

\n

BTD_Mod_Helper.UI.Modded Namespace

\n\n\n\n\n\n\n\n\n\n\n\n\n\n
Classes
RoundSetChangerClass controlling the in game Round Set override UI
","tableOfContentsHtml":"","title":"README"}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Home.json b/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Home.json deleted file mode 100644 index 28b20ebc4..000000000 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Home.json +++ /dev/null @@ -1 +0,0 @@ -{"pageProps":{"data":{"contentHtml":"

Welcome to the BTD-Mod-Helper wiki!

\n

Here you'll find valuable information that we've gathered together to help you use our Mod Helper to make great mods.

\n

Use the Sidebar to the right to navigate to where you want to go.

\n

If you're new to Mod Making and looking to make your first mod, just go through the \"Starting BTD Modding\" category.

","tableOfContentsHtml":"","title":"Home"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Useful-Resources.json b/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Useful-Resources.json deleted file mode 100644 index 0368e163a..000000000 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/Useful-Resources.json +++ /dev/null @@ -1 +0,0 @@ -{"pageProps":{"data":{"contentHtml":"

BTD6 Mods and Discussion Discord Server

\n

Guide for Installing Mods

\n

Harmony Patch Documentation

\n

BTD6 Harmony Patching

\n

Asset Studio

","tableOfContentsHtml":"","title":"Useful Resources"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/_Sidebar.json b/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/_Sidebar.json deleted file mode 100644 index 9c11cb061..000000000 --- a/_next/data/w1EjGv8jpU7KOwLRtxI1P/wiki/_Sidebar.json +++ /dev/null @@ -1 +0,0 @@ -{"pageProps":{"data":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":"","title":"_Sidebar"},"sidebar":{"contentHtml":"
Home
\n
Install Guide
\n
Starting BTD Modding
\n

Prerequisites

\n

Getting Started

\n
Mod Helper Features
\n

Making a Custom Tower

\n

Making a Custom Paragon

\n

Making a Custom Hero

\n
3.0 Features
\n

Appearing in the Mod Browser

\n

Making a Custom Bloon

\n

Making a Custom Game Mode

\n

Making a Custom Round Set

\n

Custom UI (ModHelperComponents)

\n

Custom Menu Screens

\n

Custom Byte Loaders

\n
BTD Modding Info
\n

BTD6 Internal Structure

\n

Looking at BTD6 Code (Sorta)

\n

IL2CPP Is Weird

\n

Useful Resources

\n
Mod Helper Utilities
\n

Using Mod Helper Hooks

\n

ModContent

\n

Custom Textures and Displays

\n

In Game Mod Settings

\n
Extension Methods
\n

Common Extension Methods

\n

Array Extension Methods

","tableOfContentsHtml":""}},"__N_SSG":true} \ No newline at end of file diff --git a/_next/static/chunks/251-ddc1856b9a7818ba.js b/_next/static/chunks/251-ddc1856b9a7818ba.js new file mode 100644 index 000000000..519dccb48 --- /dev/null +++ b/_next/static/chunks/251-ddc1856b9a7818ba.js @@ -0,0 +1,6 @@ +(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[251],{62199:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.createTOC=void 0;let r=n(32443),i=n(88079);function createList(e,t,n){let r={type:"element",tagName:"ol",properties:{className:i.buildClass(n.cssClasses.list,t)},children:[]};if(e){let t=createListItem(e,n);r.children.push(t)}return r}function createListItem(e,t){return{type:"element",tagName:"li",data:{hookArgs:[e]},properties:{className:i.buildClass(t.cssClasses.listItem,e.tagName)},children:[{type:"element",tagName:"a",properties:{className:i.buildClass(t.cssClasses.link,e.tagName),href:`#${e.properties.id||""}`},children:[{type:"text",value:r.getInnerText(e)}]}]}}t.createTOC=function(e,t){let n=function(e,t){let n=[],r={depth:0,headingNumber:0,list:void 0};for(let i of e){let e=parseInt(i.tagName.slice(-1),10);if(e>r.headingNumber){let a=r.depth+1,o={depth:a,headingNumber:e,list:createList(i,a,t)};r.list&&r.list.children.slice(-1)[0].children.push(o.list),n.push(o),r=o}else{if(e=0;t--){let i=n[t];if(i.headingNumber===e){n=n.slice(0,t+1),r=i;break}}r.headingNumber=Math.min(r.headingNumber,e)}let a=createListItem(i,t);r.list.children.push(a)}}return 0===n.length?createList(void 0,1,t):n[0].list}(e,t);return t.nav?{type:"element",tagName:"nav",properties:{className:t.cssClasses.toc||void 0},children:[n]}:(n.properties.className=[t.cssClasses.toc,n.properties.className].filter(Boolean).join(" ")||void 0,n)}},50589:function(e,t){"use strict";function customizationHook(e,t,n=[]){if(!e)return t;let r=e(t,...n);return r&&"object"==typeof r?r:!0===r||void 0===r?t:void 0}Object.defineProperty(t,"__esModule",{value:!0}),t.customizationHooks=void 0,t.customizationHooks=function(e,t){let{customizeTOC:n,customizeTOCItem:r}=t;return function customizeNodes(e,t,n){if(n)for(let r of e.children){if(r.tagName===t){let t=r.data&&r.data.hookArgs;if(t){let i=customizationHook(n,r,t);(function(e,t,n){if(n!==t){let r=e.children.indexOf(t);void 0===n?e.children.splice(r,1):e.children.splice(r,1,n)}})(e,r,i)}}r.children&&customizeNodes(r,t,n)}}(e,"li",r),customizationHook(n,e)}},3551:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.findHeadings=void 0;let r=n(27425);t.findHeadings=function(e,t){let n=[];return function findHeadingsRecursive(e,t,n){if(r.isHeadingNode(e,n)&&t.push(e),e.children)for(let r of e.children)findHeadingsRecursive(r,t,n)}(e,n,t),n}},76119:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.findMainNode=void 0;let r=n(27425);function findTagName(e,t){if(r.isHtmlElementNode(e)&&e.tagName===t)return[e,void 0];if(e.children)for(let n of e.children){let[r]=findTagName(n,t);if(r)return[r,e]}return[void 0,void 0]}t.findMainNode=function(e){let[t,n]=findTagName(e,"body"),[r,i]=findTagName(t||e,"main");return r?[r,i||t||e]:[t||e,n||e]}},32443:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getInnerText=void 0,t.getInnerText=function getInnerText(e){let t="";if("text"===e.type&&(t+=e.value||""),e.children)for(let n of e.children)t+=getInnerText(n);return t}},26362:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),i=this&&this.__exportStar||function(e,t){for(var n in e)"default"===n||t.hasOwnProperty(n)||r(t,e,n)};Object.defineProperty(t,"__esModule",{value:!0}),t.toc=void 0;let a=n(63309);Object.defineProperty(t,"toc",{enumerable:!0,get:function(){return a.toc}}),i(n(31099),t),t.default=a.toc,"object"==typeof e.exports&&(e.exports=Object.assign(e.exports.default,e.exports))},20002:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.insertTOC=void 0,t.insertTOC=function(e,t,n,{position:r}){let i=n.children.indexOf(t);switch(r){case"beforebegin":n.children.splice(i,0,e);break;case"afterbegin":t.children.unshift(e);break;case"beforeend":t.children.push(e);break;case"afterend":n.children.splice(i+1,0,e);break;default:throw Error(`Invalid table-of-contents position: ${r}`)}}},88079:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.buildClass=t.NormalizedOptions=void 0,t.NormalizedOptions=class{constructor(e={}){let t=e.cssClasses||{};this.nav=void 0===e.nav||!!e.nav,this.position=e.position||"afterbegin",this.headings=e.headings||["h1","h2","h3","h4","h5","h6"],this.cssClasses={toc:void 0===t.toc?"toc":t.toc,list:void 0===t.list?"toc-level":t.list,listItem:void 0===t.listItem?"toc-item":t.listItem,link:void 0===t.link?"toc-link":t.link},this.customizeTOC=e.customizeTOC,this.customizeTOCItem=e.customizeTOCItem}},t.buildClass=function(e,t){if(e){let n=e;return t&&(n+=` ${e}-${t}`),n}}},63309:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.toc=void 0;let r=n(62199),i=n(50589),a=n(3551),o=n(76119),s=n(20002),l=n(88079);t.toc=function(e){let t=new l.NormalizedOptions(e);return function(e){let[n,l]=o.findMainNode(e),c=a.findHeadings(n,t),u=r.createTOC(c,t),d=i.customizationHooks(u,t);return d&&s.insertTOC(d,n,l,t),e}}},27425:function(e,t){"use strict";function isHtmlElementNode(e){return"object"==typeof e&&"element"===e.type&&"string"==typeof e.tagName&&"properties"in e&&"object"==typeof e.properties}Object.defineProperty(t,"__esModule",{value:!0}),t.isHeadingNode=t.isHtmlElementNode=void 0,t.isHtmlElementNode=isHtmlElementNode,t.isHeadingNode=function(e,t){return isHtmlElementNode(e)&&t.headings.includes(e.tagName)}},31099:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0})},90478:function(e,t,n){"use strict";var r=n(50791),i=Object.prototype.hasOwnProperty,a={align:"text-align",valign:"vertical-align",height:"height",width:"width"};function visitor(e){var t;if("tr"===e.tagName||"td"===e.tagName||"th"===e.tagName)for(t in a)i.call(a,t)&&void 0!==e.properties[t]&&(function(e,t,n){var r=(e.properties.style||"").trim();r&&!/;\s*/.test(r)&&(r+=";"),r&&(r+=" ");var i=r+t+": "+n+";";e.properties.style=i}(e,a[t],e.properties[t]),delete e.properties[t])}e.exports=function(e){return r(e,"element",visitor),e}},93790:function(e){"use strict";function ok(){return!0}e.exports=function convert(e){if("string"==typeof e)return function(t){return!!(t&&t.type===e)};if(null==e)return ok;if("object"==typeof e)return("length"in e?function(e){var t=function(e){for(var t=[],n=e.length,r=-1;++r-1&&i=s)throw Error("Expected symbol but end of file reached.");if(l=e.charAt(t),r.identSpecialChars[l])n+=l;else if(r.isHex(l)){var i=l;for(t++,l=e.charAt(t);r.isHex(l);)i+=l,t++,l=e.charAt(t);" "===l&&(t++,l=e.charAt(t)),n+=String.fromCharCode(parseInt(i,16));continue}else n+=l}else break;t++,l=e.charAt(t)}return n}function skipWhitespace(){l=e.charAt(t);for(var n=!1;" "===l||" "===l||"\n"===l||"\r"===l||"\f"===l;)n=!0,t++,l=e.charAt(t);return n}function parseSelector(){var n=parseSingleSelector();if(!n)return null;var r=n;for(l=e.charAt(t);","===l;){if(t++,skipWhitespace(),"selectors"!==r.type&&(r={type:"selectors",selectors:[n]}),!(n=parseSingleSelector()))throw Error('Rule expected after ",".');r.selectors.push(n)}return r}function parseSingleSelector(){skipWhitespace();var n={type:"ruleSet"},r=parseRule();if(!r)return null;for(var i=n;r&&(r.type="rule",i.rule=r,i=r,skipWhitespace(),l=e.charAt(t),!(t>=s)&&","!==l&&")"!==l);)if(a[l]){var o=l;if(t++,skipWhitespace(),!(r=parseRule()))throw Error('Rule expected after "'+o+'".');r.nestingOperator=o}else(r=parseRule())&&(r.nestingOperator=null);return n}function parseRule(){for(var a=null;t=s)throw Error('Expected "=" but end of file reached.');if("="!==l)throw Error('Expected "=" but "'+l+'" found.');c.operator=u+"=",t++,skipWhitespace();var d="";if(c.valueType="string",'"'===l)d=getStr('"',r.doubleQuotesEscapeChars);else if("'"===l)d=getStr("'",r.singleQuoteEscapeChars);else if(o&&"$"===l)t++,d=getIdent(),c.valueType="substitute";else{for(;t=s)throw Error('Expected "]" but end of file reached.');if("]"!==l)throw Error('Expected "]" but "'+l+'" found.');t++,c.value=d}((a=a||{}).attrs=a.attrs||[]).push(c)}else if(":"===l){t++;var p=getIdent(),f={name:p};if("("===l){t++;var m="";if(skipWhitespace(),"selector"===n[p])f.valueType="selector",m=parseSelector();else{if(f.valueType=n[p]||"string",'"'===l)m=getStr('"',r.doubleQuotesEscapeChars);else if("'"===l)m=getStr("'",r.singleQuoteEscapeChars);else if(o&&"$"===l)t++,m=getIdent(),f.valueType="substitute";else{for(;t=s)throw Error('Expected ")" but end of file reached.');if(")"!==l)throw Error('Expected ")" but "'+l+'" found.');t++,f.value=m}((a=a||{}).pseudos=a.pseudos||[]).push(f)}else break;return a}return function(){var n=parseSelector();if(t="a"&&e<="z"||e>="A"&&e<="Z"||"-"===e||"_"===e},t.isIdent=function(e){return e>="a"&&e<="z"||e>="A"&&e<="Z"||e>="0"&&e<="9"||"-"===e||"_"===e},t.isHex=function(e){return e>="a"&&e<="f"||e>="A"&&e<="F"||e>="0"&&e<="9"},t.escapeIdentifier=function(e){for(var n=e.length,r="",i=0;i="A"&&a<="Z"||a>="a"&&a<="z"||0!==i&&a>="0"&&a<="9")r+=a;else{var o=a.charCodeAt(0);if((63488&o)==55296){var s=e.charCodeAt(i++);if((64512&o)!=55296||(64512&s)!=56320)throw Error("UCS-2(decode): illegal sequence");o=((1023&o)<<10)+(1023&s)+65536}r+="\\"+o.toString(16)+" "}i++}return r},t.escapeStr=function(e){for(var n,r=e.length,i="",a=0;a":!0,"?":!0,"@":!0,"[":!0,"\\":!0,"]":!0,"^":!0,"`":!0,"{":!0,"|":!0,"}":!0,"~":!0},t.strReplacementsRev={"\n":"\\n","\r":"\\r"," ":"\\t","\f":"\\f","\v":"\\v"},t.singleQuoteEscapeChars={n:"\n",r:"\r",t:" ",f:"\f","\\":"\\","'":"'"},t.doubleQuotesEscapeChars={n:"\n",r:"\r",t:" ",f:"\f","\\":"\\",'"':'"'}},94470:function(e){"use strict";var t=Object.prototype.hasOwnProperty,n=Object.prototype.toString,r=Object.defineProperty,i=Object.getOwnPropertyDescriptor,isArray=function(e){return"function"==typeof Array.isArray?Array.isArray(e):"[object Array]"===n.call(e)},isPlainObject=function(e){if(!e||"[object Object]"!==n.call(e))return!1;var r,i=t.call(e,"constructor"),a=e.constructor&&e.constructor.prototype&&t.call(e.constructor.prototype,"isPrototypeOf");if(e.constructor&&!i&&!a)return!1;for(r in e);return void 0===r||t.call(e,r)},setProperty=function(e,t){r&&"__proto__"===t.name?r(e,t.name,{enumerable:!0,configurable:!0,value:t.newValue,writable:!0}):e[t.name]=t.newValue},getProperty=function(e,n){if("__proto__"===n){if(!t.call(e,n))return;if(i)return i(e,n).value}return e[n]};e.exports=function extend(){var e,t,n,r,i,a,o=arguments[0],s=1,l=arguments.length,c=!1;for("boolean"==typeof o&&(c=o,o=arguments[1]||{},s=2),(null==o||"object"!=typeof o&&"function"!=typeof o)&&(o={});s0?parseInt(n):null}(),t){case"b":c+=parseInt(nextArg(),10).toString(2);break;case"c":"string"==typeof(n=nextArg())||n instanceof String?c+=n:c+=String.fromCharCode(parseInt(n,10));break;case"d":c+=parseInt(nextArg(),10);break;case"f":r=String(parseFloat(nextArg()).toFixed(i||6)),c+=d?r:r.replace(/^0/,"");break;case"j":c+=JSON.stringify(nextArg());break;case"o":c+="0"+parseInt(nextArg(),10).toString(8);break;case"s":c+=nextArg();break;case"x":c+="0x"+parseInt(nextArg(),10).toString(16);break;case"X":c+="0x"+parseInt(nextArg(),10).toString(16).toUpperCase();break;default:c+=t}else"%"===t?u=!0:c+=t;return c}(t=e.exports=format).format=format,t.vsprintf=function(e,t){return format.apply(null,[e].concat(t))},"undefined"!=typeof console&&"function"==typeof console.log&&(t.printf=function(){console.log(format.apply(null,arguments))})}()},18139:function(e){var t=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,n=/\n/g,r=/^\s*/,i=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,a=/^:\s*/,o=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,s=/^[;\s]*/,l=/^\s+|\s+$/g;function trim(e){return e?e.replace(l,""):""}e.exports=function(e,l){if("string"!=typeof e)throw TypeError("First argument must be a string");if(!e)return[];l=l||{};var c=1,u=1;function updatePosition(e){var t=e.match(n);t&&(c+=t.length);var r=e.lastIndexOf("\n");u=~r?e.length-r:u+e.length}function position(){var e={line:c,column:u};return function(t){return t.position=new Position(e),match(r),t}}function Position(e){this.start=e,this.end={line:c,column:u},this.source=l.source}Position.prototype.content=e;var d=[];function error(t){var n=Error(l.source+":"+c+":"+u+": "+t);if(n.reason=t,n.filename=l.source,n.line=c,n.column=u,n.source=e,l.silent)d.push(n);else throw n}function match(t){var n=t.exec(e);if(n){var r=n[0];return updatePosition(r),e=e.slice(r.length),n}}function comments(e){var t;for(e=e||[];t=comment();)!1!==t&&e.push(t);return e}function comment(){var t=position();if("/"==e.charAt(0)&&"*"==e.charAt(1)){for(var n=2;""!=e.charAt(n)&&("*"!=e.charAt(n)||"/"!=e.charAt(n+1));)++n;if(n+=2,""===e.charAt(n-1))return error("End of comment missing");var r=e.slice(2,n-2);return u+=2,updatePosition(r),e=e.slice(n),u+=2,t({type:"comment",comment:r})}}return match(r),function(){var e,n=[];for(comments(n);e=function(){var e=position(),n=match(i);if(n){if(comment(),!match(a))return error("property missing ':'");var r=match(o),l=e({type:"declaration",property:trim(n[0].replace(t,"")),value:r?trim(r[0].replace(t,"")):""});return match(s),l}}();)!1!==e&&(n.push(e),comments(n));return n}()}},48738:function(e){/*! + * Determine if an object is a Buffer + * + * @author Feross Aboukhadijeh + * @license MIT + */e.exports=function(e){return null!=e&&null!=e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}},31515:function(e,t,n){"use strict";let{DOCUMENT_MODE:r}=n(16152),i="html",a=["+//silmaril//dtd html pro v0r11 19970101//","-//as//dtd html 3.0 aswedit + extensions//","-//advasoft ltd//dtd html 3.0 aswedit + extensions//","-//ietf//dtd html 2.0 level 1//","-//ietf//dtd html 2.0 level 2//","-//ietf//dtd html 2.0 strict level 1//","-//ietf//dtd html 2.0 strict level 2//","-//ietf//dtd html 2.0 strict//","-//ietf//dtd html 2.0//","-//ietf//dtd html 2.1e//","-//ietf//dtd html 3.0//","-//ietf//dtd html 3.2 final//","-//ietf//dtd html 3.2//","-//ietf//dtd html 3//","-//ietf//dtd html level 0//","-//ietf//dtd html level 1//","-//ietf//dtd html level 2//","-//ietf//dtd html level 3//","-//ietf//dtd html strict level 0//","-//ietf//dtd html strict level 1//","-//ietf//dtd html strict level 2//","-//ietf//dtd html strict level 3//","-//ietf//dtd html strict//","-//ietf//dtd html//","-//metrius//dtd metrius presentational//","-//microsoft//dtd internet explorer 2.0 html strict//","-//microsoft//dtd internet explorer 2.0 html//","-//microsoft//dtd internet explorer 2.0 tables//","-//microsoft//dtd internet explorer 3.0 html strict//","-//microsoft//dtd internet explorer 3.0 html//","-//microsoft//dtd internet explorer 3.0 tables//","-//netscape comm. corp.//dtd html//","-//netscape comm. corp.//dtd strict html//","-//o'reilly and associates//dtd html 2.0//","-//o'reilly and associates//dtd html extended 1.0//","-//o'reilly and associates//dtd html extended relaxed 1.0//","-//sq//dtd html 2.0 hotmetal + extensions//","-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//","-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//","-//spyglass//dtd html 2.0 extended//","-//sun microsystems corp.//dtd hotjava html//","-//sun microsystems corp.//dtd hotjava strict html//","-//w3c//dtd html 3 1995-03-24//","-//w3c//dtd html 3.2 draft//","-//w3c//dtd html 3.2 final//","-//w3c//dtd html 3.2//","-//w3c//dtd html 3.2s draft//","-//w3c//dtd html 4.0 frameset//","-//w3c//dtd html 4.0 transitional//","-//w3c//dtd html experimental 19960712//","-//w3c//dtd html experimental 970421//","-//w3c//dtd w3 html//","-//w3o//dtd w3 html 3.0//","-//webtechs//dtd mozilla html 2.0//","-//webtechs//dtd mozilla html//"],o=a.concat(["-//w3c//dtd html 4.01 frameset//","-//w3c//dtd html 4.01 transitional//"]),s=["-//w3o//dtd w3 html strict 3.0//en//","-/w3c/dtd html 4.0 transitional/en","html"],l=["-//w3c//dtd xhtml 1.0 frameset//","-//w3c//dtd xhtml 1.0 transitional//"],c=l.concat(["-//w3c//dtd html 4.01 frameset//","-//w3c//dtd html 4.01 transitional//"]);function enquoteDoctypeId(e){let t=-1!==e.indexOf('"')?"'":'"';return t+e+t}function hasPrefix(e,t){for(let n=0;n-1)return r.QUIRKS;let e=null===t?o:a;if(hasPrefix(n,e))return r.QUIRKS;if(hasPrefix(n,e=null===t?l:c))return r.LIMITED_QUIRKS}return r.NO_QUIRKS},t.serializeContent=function(e,t,n){let r="!DOCTYPE ";return e&&(r+=e),t?r+=" PUBLIC "+enquoteDoctypeId(t):n&&(r+=" SYSTEM"),null!==n&&(r+=" "+enquoteDoctypeId(n)),r}},41734:function(e){"use strict";e.exports={controlCharacterInInputStream:"control-character-in-input-stream",noncharacterInInputStream:"noncharacter-in-input-stream",surrogateInInputStream:"surrogate-in-input-stream",nonVoidHtmlElementStartTagWithTrailingSolidus:"non-void-html-element-start-tag-with-trailing-solidus",endTagWithAttributes:"end-tag-with-attributes",endTagWithTrailingSolidus:"end-tag-with-trailing-solidus",unexpectedSolidusInTag:"unexpected-solidus-in-tag",unexpectedNullCharacter:"unexpected-null-character",unexpectedQuestionMarkInsteadOfTagName:"unexpected-question-mark-instead-of-tag-name",invalidFirstCharacterOfTagName:"invalid-first-character-of-tag-name",unexpectedEqualsSignBeforeAttributeName:"unexpected-equals-sign-before-attribute-name",missingEndTagName:"missing-end-tag-name",unexpectedCharacterInAttributeName:"unexpected-character-in-attribute-name",unknownNamedCharacterReference:"unknown-named-character-reference",missingSemicolonAfterCharacterReference:"missing-semicolon-after-character-reference",unexpectedCharacterAfterDoctypeSystemIdentifier:"unexpected-character-after-doctype-system-identifier",unexpectedCharacterInUnquotedAttributeValue:"unexpected-character-in-unquoted-attribute-value",eofBeforeTagName:"eof-before-tag-name",eofInTag:"eof-in-tag",missingAttributeValue:"missing-attribute-value",missingWhitespaceBetweenAttributes:"missing-whitespace-between-attributes",missingWhitespaceAfterDoctypePublicKeyword:"missing-whitespace-after-doctype-public-keyword",missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers:"missing-whitespace-between-doctype-public-and-system-identifiers",missingWhitespaceAfterDoctypeSystemKeyword:"missing-whitespace-after-doctype-system-keyword",missingQuoteBeforeDoctypePublicIdentifier:"missing-quote-before-doctype-public-identifier",missingQuoteBeforeDoctypeSystemIdentifier:"missing-quote-before-doctype-system-identifier",missingDoctypePublicIdentifier:"missing-doctype-public-identifier",missingDoctypeSystemIdentifier:"missing-doctype-system-identifier",abruptDoctypePublicIdentifier:"abrupt-doctype-public-identifier",abruptDoctypeSystemIdentifier:"abrupt-doctype-system-identifier",cdataInHtmlContent:"cdata-in-html-content",incorrectlyOpenedComment:"incorrectly-opened-comment",eofInScriptHtmlCommentLikeText:"eof-in-script-html-comment-like-text",eofInDoctype:"eof-in-doctype",nestedComment:"nested-comment",abruptClosingOfEmptyComment:"abrupt-closing-of-empty-comment",eofInComment:"eof-in-comment",incorrectlyClosedComment:"incorrectly-closed-comment",eofInCdata:"eof-in-cdata",absenceOfDigitsInNumericCharacterReference:"absence-of-digits-in-numeric-character-reference",nullCharacterReference:"null-character-reference",surrogateCharacterReference:"surrogate-character-reference",characterReferenceOutsideUnicodeRange:"character-reference-outside-unicode-range",controlCharacterReference:"control-character-reference",noncharacterCharacterReference:"noncharacter-character-reference",missingWhitespaceBeforeDoctypeName:"missing-whitespace-before-doctype-name",missingDoctypeName:"missing-doctype-name",invalidCharacterSequenceAfterDoctypeName:"invalid-character-sequence-after-doctype-name",duplicateAttribute:"duplicate-attribute",nonConformingDoctype:"non-conforming-doctype",missingDoctype:"missing-doctype",misplacedDoctype:"misplaced-doctype",endTagWithoutMatchingOpenElement:"end-tag-without-matching-open-element",closingOfElementWithOpenChildElements:"closing-of-element-with-open-child-elements",disallowedContentInNoscriptInHead:"disallowed-content-in-noscript-in-head",openElementsLeftAfterEof:"open-elements-left-after-eof",abandonedHeadElementChild:"abandoned-head-element-child",misplacedStartTagForHeadElement:"misplaced-start-tag-for-head-element",nestedNoscriptInHead:"nested-noscript-in-head",eofInElementThatCanContainOnlyText:"eof-in-element-that-can-contain-only-text"}},88779:function(e,t,n){"use strict";let r=n(55763),i=n(16152),a=i.TAG_NAMES,o=i.NAMESPACES,s=i.ATTRS,l={TEXT_HTML:"text/html",APPLICATION_XML:"application/xhtml+xml"},c={attributename:"attributeName",attributetype:"attributeType",basefrequency:"baseFrequency",baseprofile:"baseProfile",calcmode:"calcMode",clippathunits:"clipPathUnits",diffuseconstant:"diffuseConstant",edgemode:"edgeMode",filterunits:"filterUnits",glyphref:"glyphRef",gradienttransform:"gradientTransform",gradientunits:"gradientUnits",kernelmatrix:"kernelMatrix",kernelunitlength:"kernelUnitLength",keypoints:"keyPoints",keysplines:"keySplines",keytimes:"keyTimes",lengthadjust:"lengthAdjust",limitingconeangle:"limitingConeAngle",markerheight:"markerHeight",markerunits:"markerUnits",markerwidth:"markerWidth",maskcontentunits:"maskContentUnits",maskunits:"maskUnits",numoctaves:"numOctaves",pathlength:"pathLength",patterncontentunits:"patternContentUnits",patterntransform:"patternTransform",patternunits:"patternUnits",pointsatx:"pointsAtX",pointsaty:"pointsAtY",pointsatz:"pointsAtZ",preservealpha:"preserveAlpha",preserveaspectratio:"preserveAspectRatio",primitiveunits:"primitiveUnits",refx:"refX",refy:"refY",repeatcount:"repeatCount",repeatdur:"repeatDur",requiredextensions:"requiredExtensions",requiredfeatures:"requiredFeatures",specularconstant:"specularConstant",specularexponent:"specularExponent",spreadmethod:"spreadMethod",startoffset:"startOffset",stddeviation:"stdDeviation",stitchtiles:"stitchTiles",surfacescale:"surfaceScale",systemlanguage:"systemLanguage",tablevalues:"tableValues",targetx:"targetX",targety:"targetY",textlength:"textLength",viewbox:"viewBox",viewtarget:"viewTarget",xchannelselector:"xChannelSelector",ychannelselector:"yChannelSelector",zoomandpan:"zoomAndPan"},u={"xlink:actuate":{prefix:"xlink",name:"actuate",namespace:o.XLINK},"xlink:arcrole":{prefix:"xlink",name:"arcrole",namespace:o.XLINK},"xlink:href":{prefix:"xlink",name:"href",namespace:o.XLINK},"xlink:role":{prefix:"xlink",name:"role",namespace:o.XLINK},"xlink:show":{prefix:"xlink",name:"show",namespace:o.XLINK},"xlink:title":{prefix:"xlink",name:"title",namespace:o.XLINK},"xlink:type":{prefix:"xlink",name:"type",namespace:o.XLINK},"xml:base":{prefix:"xml",name:"base",namespace:o.XML},"xml:lang":{prefix:"xml",name:"lang",namespace:o.XML},"xml:space":{prefix:"xml",name:"space",namespace:o.XML},xmlns:{prefix:"",name:"xmlns",namespace:o.XMLNS},"xmlns:xlink":{prefix:"xmlns",name:"xlink",namespace:o.XMLNS}},d=t.SVG_TAG_NAMES_ADJUSTMENT_MAP={altglyph:"altGlyph",altglyphdef:"altGlyphDef",altglyphitem:"altGlyphItem",animatecolor:"animateColor",animatemotion:"animateMotion",animatetransform:"animateTransform",clippath:"clipPath",feblend:"feBlend",fecolormatrix:"feColorMatrix",fecomponenttransfer:"feComponentTransfer",fecomposite:"feComposite",feconvolvematrix:"feConvolveMatrix",fediffuselighting:"feDiffuseLighting",fedisplacementmap:"feDisplacementMap",fedistantlight:"feDistantLight",feflood:"feFlood",fefunca:"feFuncA",fefuncb:"feFuncB",fefuncg:"feFuncG",fefuncr:"feFuncR",fegaussianblur:"feGaussianBlur",feimage:"feImage",femerge:"feMerge",femergenode:"feMergeNode",femorphology:"feMorphology",feoffset:"feOffset",fepointlight:"fePointLight",fespecularlighting:"feSpecularLighting",fespotlight:"feSpotLight",fetile:"feTile",feturbulence:"feTurbulence",foreignobject:"foreignObject",glyphref:"glyphRef",lineargradient:"linearGradient",radialgradient:"radialGradient",textpath:"textPath"},p={[a.B]:!0,[a.BIG]:!0,[a.BLOCKQUOTE]:!0,[a.BODY]:!0,[a.BR]:!0,[a.CENTER]:!0,[a.CODE]:!0,[a.DD]:!0,[a.DIV]:!0,[a.DL]:!0,[a.DT]:!0,[a.EM]:!0,[a.EMBED]:!0,[a.H1]:!0,[a.H2]:!0,[a.H3]:!0,[a.H4]:!0,[a.H5]:!0,[a.H6]:!0,[a.HEAD]:!0,[a.HR]:!0,[a.I]:!0,[a.IMG]:!0,[a.LI]:!0,[a.LISTING]:!0,[a.MENU]:!0,[a.META]:!0,[a.NOBR]:!0,[a.OL]:!0,[a.P]:!0,[a.PRE]:!0,[a.RUBY]:!0,[a.S]:!0,[a.SMALL]:!0,[a.SPAN]:!0,[a.STRONG]:!0,[a.STRIKE]:!0,[a.SUB]:!0,[a.SUP]:!0,[a.TABLE]:!0,[a.TT]:!0,[a.U]:!0,[a.UL]:!0,[a.VAR]:!0};t.causesExit=function(e){let t=e.tagName,n=t===a.FONT&&(null!==r.getTokenAttr(e,s.COLOR)||null!==r.getTokenAttr(e,s.SIZE)||null!==r.getTokenAttr(e,s.FACE));return!!n||p[t]},t.adjustTokenMathMLAttrs=function(e){for(let t=0;t=55296&&e<=57343},t.isSurrogatePair=function(e){return e>=56320&&e<=57343},t.getSurrogatePairCodePoint=function(e,t){return(e-55296)*1024+9216+t},t.isControlCodePoint=function(e){return 32!==e&&10!==e&&13!==e&&9!==e&&12!==e&&e>=1&&e<=31||e>=127&&e<=159},t.isUndefinedCodePoint=function(e){return e>=64976&&e<=65007||n.indexOf(e)>-1}},23843:function(e,t,n){"use strict";let r=n(81704);e.exports=class extends r{constructor(e,t){super(e),this.posTracker=null,this.onParseError=t.onParseError}_setErrorLocation(e){e.startLine=e.endLine=this.posTracker.line,e.startCol=e.endCol=this.posTracker.col,e.startOffset=e.endOffset=this.posTracker.offset}_reportError(e){let t={code:e,startLine:-1,startCol:-1,startOffset:-1,endLine:-1,endCol:-1,endOffset:-1};this._setErrorLocation(t),this.onParseError(t)}_getOverriddenMethods(e){return{_err(t){e._reportError(t)}}}}},22232:function(e,t,n){"use strict";let r=n(23843),i=n(70050),a=n(46110),o=n(81704);e.exports=class extends r{constructor(e,t){super(e,t),this.opts=t,this.ctLoc=null,this.locBeforeToken=!1}_setErrorLocation(e){this.ctLoc&&(e.startLine=this.ctLoc.startLine,e.startCol=this.ctLoc.startCol,e.startOffset=this.ctLoc.startOffset,e.endLine=this.locBeforeToken?this.ctLoc.startLine:this.ctLoc.endLine,e.endCol=this.locBeforeToken?this.ctLoc.startCol:this.ctLoc.endCol,e.endOffset=this.locBeforeToken?this.ctLoc.startOffset:this.ctLoc.endOffset)}_getOverriddenMethods(e,t){return{_bootstrap(n,r){t._bootstrap.call(this,n,r),o.install(this.tokenizer,i,e.opts),o.install(this.tokenizer,a)},_processInputToken(n){e.ctLoc=n.location,t._processInputToken.call(this,n)},_err(t,n){e.locBeforeToken=n&&n.beforeToken,e._reportError(t)}}}}},23288:function(e,t,n){"use strict";let r=n(23843),i=n(57930),a=n(81704);e.exports=class extends r{constructor(e,t){super(e,t),this.posTracker=a.install(e,i),this.lastErrOffset=-1}_reportError(e){this.lastErrOffset!==this.posTracker.offset&&(this.lastErrOffset=this.posTracker.offset,super._reportError(e))}}},70050:function(e,t,n){"use strict";let r=n(23843),i=n(23288),a=n(81704);e.exports=class extends r{constructor(e,t){super(e,t);let n=a.install(e.preprocessor,i,t);this.posTracker=n.posTracker}}},11077:function(e,t,n){"use strict";let r=n(81704);e.exports=class extends r{constructor(e,t){super(e),this.onItemPop=t.onItemPop}_getOverriddenMethods(e,t){return{pop(){e.onItemPop(this.current),t.pop.call(this)},popAllUpToHtmlElement(){for(let t=this.stackTop;t>0;t--)e.onItemPop(this.items[t]);t.popAllUpToHtmlElement.call(this)},remove(n){e.onItemPop(this.current),t.remove.call(this,n)}}}}},452:function(e,t,n){"use strict";let r=n(81704),i=n(55763),a=n(46110),o=n(11077),s=n(16152),l=s.TAG_NAMES;e.exports=class extends r{constructor(e){super(e),this.parser=e,this.treeAdapter=this.parser.treeAdapter,this.posTracker=null,this.lastStartTagToken=null,this.lastFosterParentingLocation=null,this.currentToken=null}_setStartLocation(e){let t=null;this.lastStartTagToken&&((t=Object.assign({},this.lastStartTagToken.location)).startTag=this.lastStartTagToken.location),this.treeAdapter.setNodeSourceCodeLocation(e,t)}_setEndLocation(e,t){let n=this.treeAdapter.getNodeSourceCodeLocation(e);if(n&&t.location){let n=t.location,r=this.treeAdapter.getTagName(e),a=t.type===i.END_TAG_TOKEN&&r===t.tagName,o={};a?(o.endTag=Object.assign({},n),o.endLine=n.endLine,o.endCol=n.endCol,o.endOffset=n.endOffset):(o.endLine=n.startLine,o.endCol=n.startCol,o.endOffset=n.startOffset),this.treeAdapter.updateNodeSourceCodeLocation(e,o)}}_getOverriddenMethods(e,t){return{_bootstrap(n,i){t._bootstrap.call(this,n,i),e.lastStartTagToken=null,e.lastFosterParentingLocation=null,e.currentToken=null;let s=r.install(this.tokenizer,a);e.posTracker=s.posTracker,r.install(this.openElements,o,{onItemPop:function(t){e._setEndLocation(t,e.currentToken)}})},_runParsingLoop(n){t._runParsingLoop.call(this,n);for(let t=this.openElements.stackTop;t>=0;t--)e._setEndLocation(this.openElements.items[t],e.currentToken)},_processTokenInForeignContent(n){e.currentToken=n,t._processTokenInForeignContent.call(this,n)},_processToken(n){e.currentToken=n,t._processToken.call(this,n);let r=n.type===i.END_TAG_TOKEN&&(n.tagName===l.HTML||n.tagName===l.BODY&&this.openElements.hasInScope(l.BODY));if(r)for(let t=this.openElements.stackTop;t>=0;t--){let r=this.openElements.items[t];if(this.treeAdapter.getTagName(r)===n.tagName){e._setEndLocation(r,n);break}}},_setDocumentType(e){t._setDocumentType.call(this,e);let n=this.treeAdapter.getChildNodes(this.document),r=n.length;for(let t=0;t{let a=i.MODE[r];n[a]=function(n){e.ctLoc=e._getCurrentLocation(),t[a].call(this,n)}}),n}}},57930:function(e,t,n){"use strict";let r=n(81704);e.exports=class extends r{constructor(e){super(e),this.preprocessor=e,this.isEol=!1,this.lineStartPos=0,this.droppedBufferSize=0,this.offset=0,this.col=0,this.line=1}_getOverriddenMethods(e,t){return{advance(){let n=this.pos+1,r=this.html[n];return e.isEol&&(e.isEol=!1,e.line++,e.lineStartPos=n),("\n"===r||"\r"===r&&"\n"!==this.html[n+1])&&(e.isEol=!0),e.col=n-e.lineStartPos+1,e.offset=e.droppedBufferSize+n,t.advance.call(this)},retreat(){t.retreat.call(this),e.isEol=!1,e.col=this.pos-e.lineStartPos+1},dropParsedChunk(){let n=this.pos;t.dropParsedChunk.call(this);let r=n-this.pos;e.lineStartPos-=r,e.droppedBufferSize+=r,e.offset=e.droppedBufferSize+this.pos}}}}},12484:function(e){"use strict";let FormattingElementList=class FormattingElementList{constructor(e){this.length=0,this.entries=[],this.treeAdapter=e,this.bookmark=null}_getNoahArkConditionCandidates(e){let t=[];if(this.length>=3){let n=this.treeAdapter.getAttrList(e).length,r=this.treeAdapter.getTagName(e),i=this.treeAdapter.getNamespaceURI(e);for(let e=this.length-1;e>=0;e--){let a=this.entries[e];if(a.type===FormattingElementList.MARKER_ENTRY)break;let o=a.element,s=this.treeAdapter.getAttrList(o),l=this.treeAdapter.getTagName(o)===r&&this.treeAdapter.getNamespaceURI(o)===i&&s.length===n;l&&t.push({idx:e,attrs:s})}}return t.length<3?[]:t}_ensureNoahArkCondition(e){let t=this._getNoahArkConditionCandidates(e),n=t.length;if(n){let r=this.treeAdapter.getAttrList(e),i=r.length,a=Object.create(null);for(let e=0;e=2;e--)this.entries.splice(t[e].idx,1),this.length--}}insertMarker(){this.entries.push({type:FormattingElementList.MARKER_ENTRY}),this.length++}pushElement(e,t){this._ensureNoahArkCondition(e),this.entries.push({type:FormattingElementList.ELEMENT_ENTRY,element:e,token:t}),this.length++}insertElementAfterBookmark(e,t){let n=this.length-1;for(;n>=0&&this.entries[n]!==this.bookmark;n--);this.entries.splice(n+1,0,{type:FormattingElementList.ELEMENT_ENTRY,element:e,token:t}),this.length++}removeEntry(e){for(let t=this.length-1;t>=0;t--)if(this.entries[t]===e){this.entries.splice(t,1),this.length--;break}}clearToLastMarker(){for(;this.length;){let e=this.entries.pop();if(this.length--,e.type===FormattingElementList.MARKER_ENTRY)break}}getElementEntryInScopeWithTagName(e){for(let t=this.length-1;t>=0;t--){let n=this.entries[t];if(n.type===FormattingElementList.MARKER_ENTRY)break;if(this.treeAdapter.getTagName(n.element)===e)return n}return null}getElementEntry(e){for(let t=this.length-1;t>=0;t--){let n=this.entries[t];if(n.type===FormattingElementList.ELEMENT_ENTRY&&n.element===e)return n}return null}};FormattingElementList.MARKER_ENTRY="MARKER_ENTRY",FormattingElementList.ELEMENT_ENTRY="ELEMENT_ENTRY",e.exports=FormattingElementList},7045:function(e,t,n){"use strict";let r=n(55763),i=n(46519),a=n(12484),o=n(452),s=n(22232),l=n(81704),c=n(17296),u=n(8904),d=n(31515),p=n(88779),f=n(41734),m=n(54284),g=n(16152),E=g.TAG_NAMES,b=g.NAMESPACES,T=g.ATTRS,_={scriptingEnabled:!0,sourceCodeLocationInfo:!1,onParseError:null,treeAdapter:c},A="hidden",C="INITIAL_MODE",y="BEFORE_HTML_MODE",k="BEFORE_HEAD_MODE",N="IN_HEAD_MODE",S="IN_HEAD_NO_SCRIPT_MODE",D="AFTER_HEAD_MODE",x="IN_BODY_MODE",O="TEXT_MODE",v="IN_TABLE_MODE",I="IN_TABLE_TEXT_MODE",w="IN_CAPTION_MODE",R="IN_COLUMN_GROUP_MODE",F="IN_TABLE_BODY_MODE",M="IN_ROW_MODE",L="IN_CELL_MODE",B="IN_SELECT_MODE",P="IN_SELECT_IN_TABLE_MODE",H="IN_TEMPLATE_MODE",U="AFTER_BODY_MODE",z="IN_FRAMESET_MODE",G="AFTER_FRAMESET_MODE",K="AFTER_AFTER_BODY_MODE",j="AFTER_AFTER_FRAMESET_MODE",q={[E.TR]:M,[E.TBODY]:F,[E.THEAD]:F,[E.TFOOT]:F,[E.CAPTION]:w,[E.COLGROUP]:R,[E.TABLE]:v,[E.BODY]:x,[E.FRAMESET]:z},$={[E.CAPTION]:v,[E.COLGROUP]:v,[E.TBODY]:v,[E.TFOOT]:v,[E.THEAD]:v,[E.COL]:R,[E.TR]:F,[E.TD]:M,[E.TH]:M},W={[C]:{[r.CHARACTER_TOKEN]:tokenInInitialMode,[r.NULL_CHARACTER_TOKEN]:tokenInInitialMode,[r.WHITESPACE_CHARACTER_TOKEN]:ignoreToken,[r.COMMENT_TOKEN]:appendComment,[r.DOCTYPE_TOKEN]:function(e,t){e._setDocumentType(t);let n=t.forceQuirks?g.DOCUMENT_MODE.QUIRKS:d.getDocumentMode(t);d.isConforming(t)||e._err(f.nonConformingDoctype),e.treeAdapter.setDocumentMode(e.document,n),e.insertionMode=y},[r.START_TAG_TOKEN]:tokenInInitialMode,[r.END_TAG_TOKEN]:tokenInInitialMode,[r.EOF_TOKEN]:tokenInInitialMode},[y]:{[r.CHARACTER_TOKEN]:tokenBeforeHtml,[r.NULL_CHARACTER_TOKEN]:tokenBeforeHtml,[r.WHITESPACE_CHARACTER_TOKEN]:ignoreToken,[r.COMMENT_TOKEN]:appendComment,[r.DOCTYPE_TOKEN]:ignoreToken,[r.START_TAG_TOKEN]:function(e,t){t.tagName===E.HTML?(e._insertElement(t,b.HTML),e.insertionMode=k):tokenBeforeHtml(e,t)},[r.END_TAG_TOKEN]:function(e,t){let n=t.tagName;(n===E.HTML||n===E.HEAD||n===E.BODY||n===E.BR)&&tokenBeforeHtml(e,t)},[r.EOF_TOKEN]:tokenBeforeHtml},[k]:{[r.CHARACTER_TOKEN]:tokenBeforeHead,[r.NULL_CHARACTER_TOKEN]:tokenBeforeHead,[r.WHITESPACE_CHARACTER_TOKEN]:ignoreToken,[r.COMMENT_TOKEN]:appendComment,[r.DOCTYPE_TOKEN]:misplacedDoctype,[r.START_TAG_TOKEN]:function(e,t){let n=t.tagName;n===E.HTML?startTagInBody(e,t):n===E.HEAD?(e._insertElement(t,b.HTML),e.headElement=e.openElements.current,e.insertionMode=N):tokenBeforeHead(e,t)},[r.END_TAG_TOKEN]:function(e,t){let n=t.tagName;n===E.HEAD||n===E.BODY||n===E.HTML||n===E.BR?tokenBeforeHead(e,t):e._err(f.endTagWithoutMatchingOpenElement)},[r.EOF_TOKEN]:tokenBeforeHead},[N]:{[r.CHARACTER_TOKEN]:tokenInHead,[r.NULL_CHARACTER_TOKEN]:tokenInHead,[r.WHITESPACE_CHARACTER_TOKEN]:insertCharacters,[r.COMMENT_TOKEN]:appendComment,[r.DOCTYPE_TOKEN]:misplacedDoctype,[r.START_TAG_TOKEN]:startTagInHead,[r.END_TAG_TOKEN]:endTagInHead,[r.EOF_TOKEN]:tokenInHead},[S]:{[r.CHARACTER_TOKEN]:tokenInHeadNoScript,[r.NULL_CHARACTER_TOKEN]:tokenInHeadNoScript,[r.WHITESPACE_CHARACTER_TOKEN]:insertCharacters,[r.COMMENT_TOKEN]:appendComment,[r.DOCTYPE_TOKEN]:misplacedDoctype,[r.START_TAG_TOKEN]:function(e,t){let n=t.tagName;n===E.HTML?startTagInBody(e,t):n===E.BASEFONT||n===E.BGSOUND||n===E.HEAD||n===E.LINK||n===E.META||n===E.NOFRAMES||n===E.STYLE?startTagInHead(e,t):n===E.NOSCRIPT?e._err(f.nestedNoscriptInHead):tokenInHeadNoScript(e,t)},[r.END_TAG_TOKEN]:function(e,t){let n=t.tagName;n===E.NOSCRIPT?(e.openElements.pop(),e.insertionMode=N):n===E.BR?tokenInHeadNoScript(e,t):e._err(f.endTagWithoutMatchingOpenElement)},[r.EOF_TOKEN]:tokenInHeadNoScript},[D]:{[r.CHARACTER_TOKEN]:tokenAfterHead,[r.NULL_CHARACTER_TOKEN]:tokenAfterHead,[r.WHITESPACE_CHARACTER_TOKEN]:insertCharacters,[r.COMMENT_TOKEN]:appendComment,[r.DOCTYPE_TOKEN]:misplacedDoctype,[r.START_TAG_TOKEN]:function(e,t){let n=t.tagName;n===E.HTML?startTagInBody(e,t):n===E.BODY?(e._insertElement(t,b.HTML),e.framesetOk=!1,e.insertionMode=x):n===E.FRAMESET?(e._insertElement(t,b.HTML),e.insertionMode=z):n===E.BASE||n===E.BASEFONT||n===E.BGSOUND||n===E.LINK||n===E.META||n===E.NOFRAMES||n===E.SCRIPT||n===E.STYLE||n===E.TEMPLATE||n===E.TITLE?(e._err(f.abandonedHeadElementChild),e.openElements.push(e.headElement),startTagInHead(e,t),e.openElements.remove(e.headElement)):n===E.HEAD?e._err(f.misplacedStartTagForHeadElement):tokenAfterHead(e,t)},[r.END_TAG_TOKEN]:function(e,t){let n=t.tagName;n===E.BODY||n===E.HTML||n===E.BR?tokenAfterHead(e,t):n===E.TEMPLATE?endTagInHead(e,t):e._err(f.endTagWithoutMatchingOpenElement)},[r.EOF_TOKEN]:tokenAfterHead},[x]:{[r.CHARACTER_TOKEN]:characterInBody,[r.NULL_CHARACTER_TOKEN]:ignoreToken,[r.WHITESPACE_CHARACTER_TOKEN]:whitespaceCharacterInBody,[r.COMMENT_TOKEN]:appendComment,[r.DOCTYPE_TOKEN]:ignoreToken,[r.START_TAG_TOKEN]:startTagInBody,[r.END_TAG_TOKEN]:endTagInBody,[r.EOF_TOKEN]:eofInBody},[O]:{[r.CHARACTER_TOKEN]:insertCharacters,[r.NULL_CHARACTER_TOKEN]:insertCharacters,[r.WHITESPACE_CHARACTER_TOKEN]:insertCharacters,[r.COMMENT_TOKEN]:ignoreToken,[r.DOCTYPE_TOKEN]:ignoreToken,[r.START_TAG_TOKEN]:ignoreToken,[r.END_TAG_TOKEN]:function(e,t){t.tagName===E.SCRIPT&&(e.pendingScript=e.openElements.current),e.openElements.pop(),e.insertionMode=e.originalInsertionMode},[r.EOF_TOKEN]:function(e,t){e._err(f.eofInElementThatCanContainOnlyText),e.openElements.pop(),e.insertionMode=e.originalInsertionMode,e._processToken(t)}},[v]:{[r.CHARACTER_TOKEN]:characterInTable,[r.NULL_CHARACTER_TOKEN]:characterInTable,[r.WHITESPACE_CHARACTER_TOKEN]:characterInTable,[r.COMMENT_TOKEN]:appendComment,[r.DOCTYPE_TOKEN]:ignoreToken,[r.START_TAG_TOKEN]:startTagInTable,[r.END_TAG_TOKEN]:endTagInTable,[r.EOF_TOKEN]:eofInBody},[I]:{[r.CHARACTER_TOKEN]:function(e,t){e.pendingCharacterTokens.push(t),e.hasNonWhitespacePendingCharacterToken=!0},[r.NULL_CHARACTER_TOKEN]:ignoreToken,[r.WHITESPACE_CHARACTER_TOKEN]:function(e,t){e.pendingCharacterTokens.push(t)},[r.COMMENT_TOKEN]:tokenInTableText,[r.DOCTYPE_TOKEN]:tokenInTableText,[r.START_TAG_TOKEN]:tokenInTableText,[r.END_TAG_TOKEN]:tokenInTableText,[r.EOF_TOKEN]:tokenInTableText},[w]:{[r.CHARACTER_TOKEN]:characterInBody,[r.NULL_CHARACTER_TOKEN]:ignoreToken,[r.WHITESPACE_CHARACTER_TOKEN]:whitespaceCharacterInBody,[r.COMMENT_TOKEN]:appendComment,[r.DOCTYPE_TOKEN]:ignoreToken,[r.START_TAG_TOKEN]:function(e,t){let n=t.tagName;n===E.CAPTION||n===E.COL||n===E.COLGROUP||n===E.TBODY||n===E.TD||n===E.TFOOT||n===E.TH||n===E.THEAD||n===E.TR?e.openElements.hasInTableScope(E.CAPTION)&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilTagNamePopped(E.CAPTION),e.activeFormattingElements.clearToLastMarker(),e.insertionMode=v,e._processToken(t)):startTagInBody(e,t)},[r.END_TAG_TOKEN]:function(e,t){let n=t.tagName;n===E.CAPTION||n===E.TABLE?e.openElements.hasInTableScope(E.CAPTION)&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilTagNamePopped(E.CAPTION),e.activeFormattingElements.clearToLastMarker(),e.insertionMode=v,n===E.TABLE&&e._processToken(t)):n!==E.BODY&&n!==E.COL&&n!==E.COLGROUP&&n!==E.HTML&&n!==E.TBODY&&n!==E.TD&&n!==E.TFOOT&&n!==E.TH&&n!==E.THEAD&&n!==E.TR&&endTagInBody(e,t)},[r.EOF_TOKEN]:eofInBody},[R]:{[r.CHARACTER_TOKEN]:tokenInColumnGroup,[r.NULL_CHARACTER_TOKEN]:tokenInColumnGroup,[r.WHITESPACE_CHARACTER_TOKEN]:insertCharacters,[r.COMMENT_TOKEN]:appendComment,[r.DOCTYPE_TOKEN]:ignoreToken,[r.START_TAG_TOKEN]:function(e,t){let n=t.tagName;n===E.HTML?startTagInBody(e,t):n===E.COL?(e._appendElement(t,b.HTML),t.ackSelfClosing=!0):n===E.TEMPLATE?startTagInHead(e,t):tokenInColumnGroup(e,t)},[r.END_TAG_TOKEN]:function(e,t){let n=t.tagName;n===E.COLGROUP?e.openElements.currentTagName===E.COLGROUP&&(e.openElements.pop(),e.insertionMode=v):n===E.TEMPLATE?endTagInHead(e,t):n!==E.COL&&tokenInColumnGroup(e,t)},[r.EOF_TOKEN]:eofInBody},[F]:{[r.CHARACTER_TOKEN]:characterInTable,[r.NULL_CHARACTER_TOKEN]:characterInTable,[r.WHITESPACE_CHARACTER_TOKEN]:characterInTable,[r.COMMENT_TOKEN]:appendComment,[r.DOCTYPE_TOKEN]:ignoreToken,[r.START_TAG_TOKEN]:function(e,t){let n=t.tagName;n===E.TR?(e.openElements.clearBackToTableBodyContext(),e._insertElement(t,b.HTML),e.insertionMode=M):n===E.TH||n===E.TD?(e.openElements.clearBackToTableBodyContext(),e._insertFakeElement(E.TR),e.insertionMode=M,e._processToken(t)):n===E.CAPTION||n===E.COL||n===E.COLGROUP||n===E.TBODY||n===E.TFOOT||n===E.THEAD?e.openElements.hasTableBodyContextInTableScope()&&(e.openElements.clearBackToTableBodyContext(),e.openElements.pop(),e.insertionMode=v,e._processToken(t)):startTagInTable(e,t)},[r.END_TAG_TOKEN]:function(e,t){let n=t.tagName;n===E.TBODY||n===E.TFOOT||n===E.THEAD?e.openElements.hasInTableScope(n)&&(e.openElements.clearBackToTableBodyContext(),e.openElements.pop(),e.insertionMode=v):n===E.TABLE?e.openElements.hasTableBodyContextInTableScope()&&(e.openElements.clearBackToTableBodyContext(),e.openElements.pop(),e.insertionMode=v,e._processToken(t)):(n!==E.BODY&&n!==E.CAPTION&&n!==E.COL&&n!==E.COLGROUP||n!==E.HTML&&n!==E.TD&&n!==E.TH&&n!==E.TR)&&endTagInTable(e,t)},[r.EOF_TOKEN]:eofInBody},[M]:{[r.CHARACTER_TOKEN]:characterInTable,[r.NULL_CHARACTER_TOKEN]:characterInTable,[r.WHITESPACE_CHARACTER_TOKEN]:characterInTable,[r.COMMENT_TOKEN]:appendComment,[r.DOCTYPE_TOKEN]:ignoreToken,[r.START_TAG_TOKEN]:function(e,t){let n=t.tagName;n===E.TH||n===E.TD?(e.openElements.clearBackToTableRowContext(),e._insertElement(t,b.HTML),e.insertionMode=L,e.activeFormattingElements.insertMarker()):n===E.CAPTION||n===E.COL||n===E.COLGROUP||n===E.TBODY||n===E.TFOOT||n===E.THEAD||n===E.TR?e.openElements.hasInTableScope(E.TR)&&(e.openElements.clearBackToTableRowContext(),e.openElements.pop(),e.insertionMode=F,e._processToken(t)):startTagInTable(e,t)},[r.END_TAG_TOKEN]:function(e,t){let n=t.tagName;n===E.TR?e.openElements.hasInTableScope(E.TR)&&(e.openElements.clearBackToTableRowContext(),e.openElements.pop(),e.insertionMode=F):n===E.TABLE?e.openElements.hasInTableScope(E.TR)&&(e.openElements.clearBackToTableRowContext(),e.openElements.pop(),e.insertionMode=F,e._processToken(t)):n===E.TBODY||n===E.TFOOT||n===E.THEAD?(e.openElements.hasInTableScope(n)||e.openElements.hasInTableScope(E.TR))&&(e.openElements.clearBackToTableRowContext(),e.openElements.pop(),e.insertionMode=F,e._processToken(t)):(n!==E.BODY&&n!==E.CAPTION&&n!==E.COL&&n!==E.COLGROUP||n!==E.HTML&&n!==E.TD&&n!==E.TH)&&endTagInTable(e,t)},[r.EOF_TOKEN]:eofInBody},[L]:{[r.CHARACTER_TOKEN]:characterInBody,[r.NULL_CHARACTER_TOKEN]:ignoreToken,[r.WHITESPACE_CHARACTER_TOKEN]:whitespaceCharacterInBody,[r.COMMENT_TOKEN]:appendComment,[r.DOCTYPE_TOKEN]:ignoreToken,[r.START_TAG_TOKEN]:function(e,t){let n=t.tagName;n===E.CAPTION||n===E.COL||n===E.COLGROUP||n===E.TBODY||n===E.TD||n===E.TFOOT||n===E.TH||n===E.THEAD||n===E.TR?(e.openElements.hasInTableScope(E.TD)||e.openElements.hasInTableScope(E.TH))&&(e._closeTableCell(),e._processToken(t)):startTagInBody(e,t)},[r.END_TAG_TOKEN]:function(e,t){let n=t.tagName;n===E.TD||n===E.TH?e.openElements.hasInTableScope(n)&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilTagNamePopped(n),e.activeFormattingElements.clearToLastMarker(),e.insertionMode=M):n===E.TABLE||n===E.TBODY||n===E.TFOOT||n===E.THEAD||n===E.TR?e.openElements.hasInTableScope(n)&&(e._closeTableCell(),e._processToken(t)):n!==E.BODY&&n!==E.CAPTION&&n!==E.COL&&n!==E.COLGROUP&&n!==E.HTML&&endTagInBody(e,t)},[r.EOF_TOKEN]:eofInBody},[B]:{[r.CHARACTER_TOKEN]:insertCharacters,[r.NULL_CHARACTER_TOKEN]:ignoreToken,[r.WHITESPACE_CHARACTER_TOKEN]:insertCharacters,[r.COMMENT_TOKEN]:appendComment,[r.DOCTYPE_TOKEN]:ignoreToken,[r.START_TAG_TOKEN]:startTagInSelect,[r.END_TAG_TOKEN]:endTagInSelect,[r.EOF_TOKEN]:eofInBody},[P]:{[r.CHARACTER_TOKEN]:insertCharacters,[r.NULL_CHARACTER_TOKEN]:ignoreToken,[r.WHITESPACE_CHARACTER_TOKEN]:insertCharacters,[r.COMMENT_TOKEN]:appendComment,[r.DOCTYPE_TOKEN]:ignoreToken,[r.START_TAG_TOKEN]:function(e,t){let n=t.tagName;n===E.CAPTION||n===E.TABLE||n===E.TBODY||n===E.TFOOT||n===E.THEAD||n===E.TR||n===E.TD||n===E.TH?(e.openElements.popUntilTagNamePopped(E.SELECT),e._resetInsertionMode(),e._processToken(t)):startTagInSelect(e,t)},[r.END_TAG_TOKEN]:function(e,t){let n=t.tagName;n===E.CAPTION||n===E.TABLE||n===E.TBODY||n===E.TFOOT||n===E.THEAD||n===E.TR||n===E.TD||n===E.TH?e.openElements.hasInTableScope(n)&&(e.openElements.popUntilTagNamePopped(E.SELECT),e._resetInsertionMode(),e._processToken(t)):endTagInSelect(e,t)},[r.EOF_TOKEN]:eofInBody},[H]:{[r.CHARACTER_TOKEN]:characterInBody,[r.NULL_CHARACTER_TOKEN]:ignoreToken,[r.WHITESPACE_CHARACTER_TOKEN]:whitespaceCharacterInBody,[r.COMMENT_TOKEN]:appendComment,[r.DOCTYPE_TOKEN]:ignoreToken,[r.START_TAG_TOKEN]:function(e,t){let n=t.tagName;if(n===E.BASE||n===E.BASEFONT||n===E.BGSOUND||n===E.LINK||n===E.META||n===E.NOFRAMES||n===E.SCRIPT||n===E.STYLE||n===E.TEMPLATE||n===E.TITLE)startTagInHead(e,t);else{let r=$[n]||x;e._popTmplInsertionMode(),e._pushTmplInsertionMode(r),e.insertionMode=r,e._processToken(t)}},[r.END_TAG_TOKEN]:function(e,t){t.tagName===E.TEMPLATE&&endTagInHead(e,t)},[r.EOF_TOKEN]:eofInTemplate},[U]:{[r.CHARACTER_TOKEN]:tokenAfterBody,[r.NULL_CHARACTER_TOKEN]:tokenAfterBody,[r.WHITESPACE_CHARACTER_TOKEN]:whitespaceCharacterInBody,[r.COMMENT_TOKEN]:function(e,t){e._appendCommentNode(t,e.openElements.items[0])},[r.DOCTYPE_TOKEN]:ignoreToken,[r.START_TAG_TOKEN]:function(e,t){t.tagName===E.HTML?startTagInBody(e,t):tokenAfterBody(e,t)},[r.END_TAG_TOKEN]:function(e,t){t.tagName===E.HTML?e.fragmentContext||(e.insertionMode=K):tokenAfterBody(e,t)},[r.EOF_TOKEN]:stopParsing},[z]:{[r.CHARACTER_TOKEN]:ignoreToken,[r.NULL_CHARACTER_TOKEN]:ignoreToken,[r.WHITESPACE_CHARACTER_TOKEN]:insertCharacters,[r.COMMENT_TOKEN]:appendComment,[r.DOCTYPE_TOKEN]:ignoreToken,[r.START_TAG_TOKEN]:function(e,t){let n=t.tagName;n===E.HTML?startTagInBody(e,t):n===E.FRAMESET?e._insertElement(t,b.HTML):n===E.FRAME?(e._appendElement(t,b.HTML),t.ackSelfClosing=!0):n===E.NOFRAMES&&startTagInHead(e,t)},[r.END_TAG_TOKEN]:function(e,t){t.tagName!==E.FRAMESET||e.openElements.isRootHtmlElementCurrent()||(e.openElements.pop(),e.fragmentContext||e.openElements.currentTagName===E.FRAMESET||(e.insertionMode=G))},[r.EOF_TOKEN]:stopParsing},[G]:{[r.CHARACTER_TOKEN]:ignoreToken,[r.NULL_CHARACTER_TOKEN]:ignoreToken,[r.WHITESPACE_CHARACTER_TOKEN]:insertCharacters,[r.COMMENT_TOKEN]:appendComment,[r.DOCTYPE_TOKEN]:ignoreToken,[r.START_TAG_TOKEN]:function(e,t){let n=t.tagName;n===E.HTML?startTagInBody(e,t):n===E.NOFRAMES&&startTagInHead(e,t)},[r.END_TAG_TOKEN]:function(e,t){t.tagName===E.HTML&&(e.insertionMode=j)},[r.EOF_TOKEN]:stopParsing},[K]:{[r.CHARACTER_TOKEN]:tokenAfterAfterBody,[r.NULL_CHARACTER_TOKEN]:tokenAfterAfterBody,[r.WHITESPACE_CHARACTER_TOKEN]:whitespaceCharacterInBody,[r.COMMENT_TOKEN]:appendCommentToDocument,[r.DOCTYPE_TOKEN]:ignoreToken,[r.START_TAG_TOKEN]:function(e,t){t.tagName===E.HTML?startTagInBody(e,t):tokenAfterAfterBody(e,t)},[r.END_TAG_TOKEN]:tokenAfterAfterBody,[r.EOF_TOKEN]:stopParsing},[j]:{[r.CHARACTER_TOKEN]:ignoreToken,[r.NULL_CHARACTER_TOKEN]:ignoreToken,[r.WHITESPACE_CHARACTER_TOKEN]:whitespaceCharacterInBody,[r.COMMENT_TOKEN]:appendCommentToDocument,[r.DOCTYPE_TOKEN]:ignoreToken,[r.START_TAG_TOKEN]:function(e,t){let n=t.tagName;n===E.HTML?startTagInBody(e,t):n===E.NOFRAMES&&startTagInHead(e,t)},[r.END_TAG_TOKEN]:ignoreToken,[r.EOF_TOKEN]:stopParsing}};function callAdoptionAgency(e,t){let n,r;for(let i=0;i<8&&((r=e.activeFormattingElements.getElementEntryInScopeWithTagName(t.tagName))?e.openElements.contains(r.element)?e.openElements.hasInScope(t.tagName)||(r=null):(e.activeFormattingElements.removeEntry(r),r=null):genericEndTagInBody(e,t),n=r);i++){let t=function(e,t){let n=null;for(let r=e.openElements.stackTop;r>=0;r--){let i=e.openElements.items[r];if(i===t.element)break;e._isSpecialElement(i)&&(n=i)}return n||(e.openElements.popUntilElementPopped(t.element),e.activeFormattingElements.removeEntry(t)),n}(e,n);if(!t)break;e.activeFormattingElements.bookmark=n;let r=function(e,t,n){let r=t,i=e.openElements.getCommonAncestor(t);for(let a=0,o=i;o!==n;a++,o=i){i=e.openElements.getCommonAncestor(o);let n=e.activeFormattingElements.getElementEntry(o),s=n&&a>=3,l=!n||s;l?(s&&e.activeFormattingElements.removeEntry(n),e.openElements.remove(o)):(o=function(e,t){let n=e.treeAdapter.getNamespaceURI(t.element),r=e.treeAdapter.createElement(t.token.tagName,n,t.token.attrs);return e.openElements.replace(t.element,r),t.element=r,r}(e,n),r===t&&(e.activeFormattingElements.bookmark=n),e.treeAdapter.detachNode(r),e.treeAdapter.appendChild(o,r),r=o)}return r}(e,t,n.element),i=e.openElements.getCommonAncestor(n.element);e.treeAdapter.detachNode(r),function(e,t,n){if(e._isElementCausesFosterParenting(t))e._fosterParentElement(n);else{let r=e.treeAdapter.getTagName(t),i=e.treeAdapter.getNamespaceURI(t);r===E.TEMPLATE&&i===b.HTML&&(t=e.treeAdapter.getTemplateContent(t)),e.treeAdapter.appendChild(t,n)}}(e,i,r),function(e,t,n){let r=e.treeAdapter.getNamespaceURI(n.element),i=n.token,a=e.treeAdapter.createElement(i.tagName,r,i.attrs);e._adoptNodes(t,a),e.treeAdapter.appendChild(t,a),e.activeFormattingElements.insertElementAfterBookmark(a,n.token),e.activeFormattingElements.removeEntry(n),e.openElements.remove(n.element),e.openElements.insertAfter(t,a)}(e,t,n)}}function ignoreToken(){}function misplacedDoctype(e){e._err(f.misplacedDoctype)}function appendComment(e,t){e._appendCommentNode(t,e.openElements.currentTmplContent||e.openElements.current)}function appendCommentToDocument(e,t){e._appendCommentNode(t,e.document)}function insertCharacters(e,t){e._insertCharacters(t)}function stopParsing(e){e.stopped=!0}function tokenInInitialMode(e,t){e._err(f.missingDoctype,{beforeToken:!0}),e.treeAdapter.setDocumentMode(e.document,g.DOCUMENT_MODE.QUIRKS),e.insertionMode=y,e._processToken(t)}function tokenBeforeHtml(e,t){e._insertFakeRootElement(),e.insertionMode=k,e._processToken(t)}function tokenBeforeHead(e,t){e._insertFakeElement(E.HEAD),e.headElement=e.openElements.current,e.insertionMode=N,e._processToken(t)}function startTagInHead(e,t){let n=t.tagName;n===E.HTML?startTagInBody(e,t):n===E.BASE||n===E.BASEFONT||n===E.BGSOUND||n===E.LINK||n===E.META?(e._appendElement(t,b.HTML),t.ackSelfClosing=!0):n===E.TITLE?e._switchToTextParsing(t,r.MODE.RCDATA):n===E.NOSCRIPT?e.options.scriptingEnabled?e._switchToTextParsing(t,r.MODE.RAWTEXT):(e._insertElement(t,b.HTML),e.insertionMode=S):n===E.NOFRAMES||n===E.STYLE?e._switchToTextParsing(t,r.MODE.RAWTEXT):n===E.SCRIPT?e._switchToTextParsing(t,r.MODE.SCRIPT_DATA):n===E.TEMPLATE?(e._insertTemplate(t,b.HTML),e.activeFormattingElements.insertMarker(),e.framesetOk=!1,e.insertionMode=H,e._pushTmplInsertionMode(H)):n===E.HEAD?e._err(f.misplacedStartTagForHeadElement):tokenInHead(e,t)}function endTagInHead(e,t){let n=t.tagName;n===E.HEAD?(e.openElements.pop(),e.insertionMode=D):n===E.BODY||n===E.BR||n===E.HTML?tokenInHead(e,t):n===E.TEMPLATE&&e.openElements.tmplCount>0?(e.openElements.generateImpliedEndTagsThoroughly(),e.openElements.currentTagName!==E.TEMPLATE&&e._err(f.closingOfElementWithOpenChildElements),e.openElements.popUntilTagNamePopped(E.TEMPLATE),e.activeFormattingElements.clearToLastMarker(),e._popTmplInsertionMode(),e._resetInsertionMode()):e._err(f.endTagWithoutMatchingOpenElement)}function tokenInHead(e,t){e.openElements.pop(),e.insertionMode=D,e._processToken(t)}function tokenInHeadNoScript(e,t){let n=t.type===r.EOF_TOKEN?f.openElementsLeftAfterEof:f.disallowedContentInNoscriptInHead;e._err(n),e.openElements.pop(),e.insertionMode=N,e._processToken(t)}function tokenAfterHead(e,t){e._insertFakeElement(E.BODY),e.insertionMode=x,e._processToken(t)}function whitespaceCharacterInBody(e,t){e._reconstructActiveFormattingElements(),e._insertCharacters(t)}function characterInBody(e,t){e._reconstructActiveFormattingElements(),e._insertCharacters(t),e.framesetOk=!1}function addressStartTagInBody(e,t){e.openElements.hasInButtonScope(E.P)&&e._closePElement(),e._insertElement(t,b.HTML)}function preStartTagInBody(e,t){e.openElements.hasInButtonScope(E.P)&&e._closePElement(),e._insertElement(t,b.HTML),e.skipNextNewLine=!0,e.framesetOk=!1}function bStartTagInBody(e,t){e._reconstructActiveFormattingElements(),e._insertElement(t,b.HTML),e.activeFormattingElements.pushElement(e.openElements.current,t)}function appletStartTagInBody(e,t){e._reconstructActiveFormattingElements(),e._insertElement(t,b.HTML),e.activeFormattingElements.insertMarker(),e.framesetOk=!1}function areaStartTagInBody(e,t){e._reconstructActiveFormattingElements(),e._appendElement(t,b.HTML),e.framesetOk=!1,t.ackSelfClosing=!0}function paramStartTagInBody(e,t){e._appendElement(t,b.HTML),t.ackSelfClosing=!0}function noembedStartTagInBody(e,t){e._switchToTextParsing(t,r.MODE.RAWTEXT)}function optgroupStartTagInBody(e,t){e.openElements.currentTagName===E.OPTION&&e.openElements.pop(),e._reconstructActiveFormattingElements(),e._insertElement(t,b.HTML)}function rbStartTagInBody(e,t){e.openElements.hasInScope(E.RUBY)&&e.openElements.generateImpliedEndTags(),e._insertElement(t,b.HTML)}function genericStartTagInBody(e,t){e._reconstructActiveFormattingElements(),e._insertElement(t,b.HTML)}function startTagInBody(e,t){let n=t.tagName;switch(n.length){case 1:n===E.I||n===E.S||n===E.B||n===E.U?bStartTagInBody(e,t):n===E.P?addressStartTagInBody(e,t):n===E.A?function(e,t){let n=e.activeFormattingElements.getElementEntryInScopeWithTagName(E.A);n&&(callAdoptionAgency(e,t),e.openElements.remove(n.element),e.activeFormattingElements.removeEntry(n)),e._reconstructActiveFormattingElements(),e._insertElement(t,b.HTML),e.activeFormattingElements.pushElement(e.openElements.current,t)}(e,t):genericStartTagInBody(e,t);break;case 2:n===E.DL||n===E.OL||n===E.UL?addressStartTagInBody(e,t):n===E.H1||n===E.H2||n===E.H3||n===E.H4||n===E.H5||n===E.H6?function(e,t){e.openElements.hasInButtonScope(E.P)&&e._closePElement();let n=e.openElements.currentTagName;(n===E.H1||n===E.H2||n===E.H3||n===E.H4||n===E.H5||n===E.H6)&&e.openElements.pop(),e._insertElement(t,b.HTML)}(e,t):n===E.LI||n===E.DD||n===E.DT?function(e,t){e.framesetOk=!1;let n=t.tagName;for(let t=e.openElements.stackTop;t>=0;t--){let r=e.openElements.items[t],i=e.treeAdapter.getTagName(r),a=null;if(n===E.LI&&i===E.LI?a=E.LI:(n===E.DD||n===E.DT)&&(i===E.DD||i===E.DT)&&(a=i),a){e.openElements.generateImpliedEndTagsWithExclusion(a),e.openElements.popUntilTagNamePopped(a);break}if(i!==E.ADDRESS&&i!==E.DIV&&i!==E.P&&e._isSpecialElement(r))break}e.openElements.hasInButtonScope(E.P)&&e._closePElement(),e._insertElement(t,b.HTML)}(e,t):n===E.EM||n===E.TT?bStartTagInBody(e,t):n===E.BR?areaStartTagInBody(e,t):n===E.HR?(e.openElements.hasInButtonScope(E.P)&&e._closePElement(),e._appendElement(t,b.HTML),e.framesetOk=!1,t.ackSelfClosing=!0):n===E.RB?rbStartTagInBody(e,t):n===E.RT||n===E.RP?(e.openElements.hasInScope(E.RUBY)&&e.openElements.generateImpliedEndTagsWithExclusion(E.RTC),e._insertElement(t,b.HTML)):n!==E.TH&&n!==E.TD&&n!==E.TR&&genericStartTagInBody(e,t);break;case 3:n===E.DIV||n===E.DIR||n===E.NAV?addressStartTagInBody(e,t):n===E.PRE?preStartTagInBody(e,t):n===E.BIG?bStartTagInBody(e,t):n===E.IMG||n===E.WBR?areaStartTagInBody(e,t):n===E.XMP?(e.openElements.hasInButtonScope(E.P)&&e._closePElement(),e._reconstructActiveFormattingElements(),e.framesetOk=!1,e._switchToTextParsing(t,r.MODE.RAWTEXT)):n===E.SVG?(e._reconstructActiveFormattingElements(),p.adjustTokenSVGAttrs(t),p.adjustTokenXMLAttrs(t),t.selfClosing?e._appendElement(t,b.SVG):e._insertElement(t,b.SVG),t.ackSelfClosing=!0):n===E.RTC?rbStartTagInBody(e,t):n!==E.COL&&genericStartTagInBody(e,t);break;case 4:n===E.HTML?0===e.openElements.tmplCount&&e.treeAdapter.adoptAttributes(e.openElements.items[0],t.attrs):n===E.BASE||n===E.LINK||n===E.META?startTagInHead(e,t):n===E.BODY?function(e,t){let n=e.openElements.tryPeekProperlyNestedBodyElement();n&&0===e.openElements.tmplCount&&(e.framesetOk=!1,e.treeAdapter.adoptAttributes(n,t.attrs))}(e,t):n===E.MAIN||n===E.MENU?addressStartTagInBody(e,t):n===E.FORM?function(e,t){let n=e.openElements.tmplCount>0;e.formElement&&!n||(e.openElements.hasInButtonScope(E.P)&&e._closePElement(),e._insertElement(t,b.HTML),n||(e.formElement=e.openElements.current))}(e,t):n===E.CODE||n===E.FONT?bStartTagInBody(e,t):n===E.NOBR?(e._reconstructActiveFormattingElements(),e.openElements.hasInScope(E.NOBR)&&(callAdoptionAgency(e,t),e._reconstructActiveFormattingElements()),e._insertElement(t,b.HTML),e.activeFormattingElements.pushElement(e.openElements.current,t)):n===E.AREA?areaStartTagInBody(e,t):n===E.MATH?(e._reconstructActiveFormattingElements(),p.adjustTokenMathMLAttrs(t),p.adjustTokenXMLAttrs(t),t.selfClosing?e._appendElement(t,b.MATHML):e._insertElement(t,b.MATHML),t.ackSelfClosing=!0):n===E.MENU?(e.openElements.hasInButtonScope(E.P)&&e._closePElement(),e._insertElement(t,b.HTML)):n!==E.HEAD&&genericStartTagInBody(e,t);break;case 5:n===E.STYLE||n===E.TITLE?startTagInHead(e,t):n===E.ASIDE?addressStartTagInBody(e,t):n===E.SMALL?bStartTagInBody(e,t):n===E.TABLE?(e.treeAdapter.getDocumentMode(e.document)!==g.DOCUMENT_MODE.QUIRKS&&e.openElements.hasInButtonScope(E.P)&&e._closePElement(),e._insertElement(t,b.HTML),e.framesetOk=!1,e.insertionMode=v):n===E.EMBED?areaStartTagInBody(e,t):n===E.INPUT?function(e,t){e._reconstructActiveFormattingElements(),e._appendElement(t,b.HTML);let n=r.getTokenAttr(t,T.TYPE);n&&n.toLowerCase()===A||(e.framesetOk=!1),t.ackSelfClosing=!0}(e,t):n===E.PARAM||n===E.TRACK?paramStartTagInBody(e,t):n===E.IMAGE?(t.tagName=E.IMG,areaStartTagInBody(e,t)):n!==E.FRAME&&n!==E.TBODY&&n!==E.TFOOT&&n!==E.THEAD&&genericStartTagInBody(e,t);break;case 6:n===E.SCRIPT?startTagInHead(e,t):n===E.CENTER||n===E.FIGURE||n===E.FOOTER||n===E.HEADER||n===E.HGROUP||n===E.DIALOG?addressStartTagInBody(e,t):n===E.BUTTON?(e.openElements.hasInScope(E.BUTTON)&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilTagNamePopped(E.BUTTON)),e._reconstructActiveFormattingElements(),e._insertElement(t,b.HTML),e.framesetOk=!1):n===E.STRIKE||n===E.STRONG?bStartTagInBody(e,t):n===E.APPLET||n===E.OBJECT?appletStartTagInBody(e,t):n===E.KEYGEN?areaStartTagInBody(e,t):n===E.SOURCE?paramStartTagInBody(e,t):n===E.IFRAME?(e.framesetOk=!1,e._switchToTextParsing(t,r.MODE.RAWTEXT)):n===E.SELECT?(e._reconstructActiveFormattingElements(),e._insertElement(t,b.HTML),e.framesetOk=!1,e.insertionMode===v||e.insertionMode===w||e.insertionMode===F||e.insertionMode===M||e.insertionMode===L?e.insertionMode=P:e.insertionMode=B):n===E.OPTION?optgroupStartTagInBody(e,t):genericStartTagInBody(e,t);break;case 7:n===E.BGSOUND?startTagInHead(e,t):n===E.DETAILS||n===E.ADDRESS||n===E.ARTICLE||n===E.SECTION||n===E.SUMMARY?addressStartTagInBody(e,t):n===E.LISTING?preStartTagInBody(e,t):n===E.MARQUEE?appletStartTagInBody(e,t):n===E.NOEMBED?noembedStartTagInBody(e,t):n!==E.CAPTION&&genericStartTagInBody(e,t);break;case 8:n===E.BASEFONT?startTagInHead(e,t):n===E.FRAMESET?function(e,t){let n=e.openElements.tryPeekProperlyNestedBodyElement();e.framesetOk&&n&&(e.treeAdapter.detachNode(n),e.openElements.popAllUpToHtmlElement(),e._insertElement(t,b.HTML),e.insertionMode=z)}(e,t):n===E.FIELDSET?addressStartTagInBody(e,t):n===E.TEXTAREA?(e._insertElement(t,b.HTML),e.skipNextNewLine=!0,e.tokenizer.state=r.MODE.RCDATA,e.originalInsertionMode=e.insertionMode,e.framesetOk=!1,e.insertionMode=O):n===E.TEMPLATE?startTagInHead(e,t):n===E.NOSCRIPT?e.options.scriptingEnabled?noembedStartTagInBody(e,t):genericStartTagInBody(e,t):n===E.OPTGROUP?optgroupStartTagInBody(e,t):n!==E.COLGROUP&&genericStartTagInBody(e,t);break;case 9:n===E.PLAINTEXT?(e.openElements.hasInButtonScope(E.P)&&e._closePElement(),e._insertElement(t,b.HTML),e.tokenizer.state=r.MODE.PLAINTEXT):genericStartTagInBody(e,t);break;case 10:n===E.BLOCKQUOTE||n===E.FIGCAPTION?addressStartTagInBody(e,t):genericStartTagInBody(e,t);break;default:genericStartTagInBody(e,t)}}function addressEndTagInBody(e,t){let n=t.tagName;e.openElements.hasInScope(n)&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilTagNamePopped(n))}function appletEndTagInBody(e,t){let n=t.tagName;e.openElements.hasInScope(n)&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilTagNamePopped(n),e.activeFormattingElements.clearToLastMarker())}function genericEndTagInBody(e,t){let n=t.tagName;for(let t=e.openElements.stackTop;t>0;t--){let r=e.openElements.items[t];if(e.treeAdapter.getTagName(r)===n){e.openElements.generateImpliedEndTagsWithExclusion(n),e.openElements.popUntilElementPopped(r);break}if(e._isSpecialElement(r))break}}function endTagInBody(e,t){let n=t.tagName;switch(n.length){case 1:n===E.A||n===E.B||n===E.I||n===E.S||n===E.U?callAdoptionAgency(e,t):n===E.P?(e.openElements.hasInButtonScope(E.P)||e._insertFakeElement(E.P),e._closePElement()):genericEndTagInBody(e,t);break;case 2:n===E.DL||n===E.UL||n===E.OL?addressEndTagInBody(e,t):n===E.LI?e.openElements.hasInListItemScope(E.LI)&&(e.openElements.generateImpliedEndTagsWithExclusion(E.LI),e.openElements.popUntilTagNamePopped(E.LI)):n===E.DD||n===E.DT?function(e,t){let n=t.tagName;e.openElements.hasInScope(n)&&(e.openElements.generateImpliedEndTagsWithExclusion(n),e.openElements.popUntilTagNamePopped(n))}(e,t):n===E.H1||n===E.H2||n===E.H3||n===E.H4||n===E.H5||n===E.H6?e.openElements.hasNumberedHeaderInScope()&&(e.openElements.generateImpliedEndTags(),e.openElements.popUntilNumberedHeaderPopped()):n===E.BR?(e._reconstructActiveFormattingElements(),e._insertFakeElement(E.BR),e.openElements.pop(),e.framesetOk=!1):n===E.EM||n===E.TT?callAdoptionAgency(e,t):genericEndTagInBody(e,t);break;case 3:n===E.BIG?callAdoptionAgency(e,t):n===E.DIR||n===E.DIV||n===E.NAV||n===E.PRE?addressEndTagInBody(e,t):genericEndTagInBody(e,t);break;case 4:n===E.BODY?e.openElements.hasInScope(E.BODY)&&(e.insertionMode=U):n===E.HTML?e.openElements.hasInScope(E.BODY)&&(e.insertionMode=U,e._processToken(t)):n===E.FORM?function(e){let t=e.openElements.tmplCount>0,n=e.formElement;t||(e.formElement=null),(n||t)&&e.openElements.hasInScope(E.FORM)&&(e.openElements.generateImpliedEndTags(),t?e.openElements.popUntilTagNamePopped(E.FORM):e.openElements.remove(n))}(e,t):n===E.CODE||n===E.FONT||n===E.NOBR?callAdoptionAgency(e,t):n===E.MAIN||n===E.MENU?addressEndTagInBody(e,t):genericEndTagInBody(e,t);break;case 5:n===E.ASIDE?addressEndTagInBody(e,t):n===E.SMALL?callAdoptionAgency(e,t):genericEndTagInBody(e,t);break;case 6:n===E.CENTER||n===E.FIGURE||n===E.FOOTER||n===E.HEADER||n===E.HGROUP||n===E.DIALOG?addressEndTagInBody(e,t):n===E.APPLET||n===E.OBJECT?appletEndTagInBody(e,t):n===E.STRIKE||n===E.STRONG?callAdoptionAgency(e,t):genericEndTagInBody(e,t);break;case 7:n===E.ADDRESS||n===E.ARTICLE||n===E.DETAILS||n===E.SECTION||n===E.SUMMARY||n===E.LISTING?addressEndTagInBody(e,t):n===E.MARQUEE?appletEndTagInBody(e,t):genericEndTagInBody(e,t);break;case 8:n===E.FIELDSET?addressEndTagInBody(e,t):n===E.TEMPLATE?endTagInHead(e,t):genericEndTagInBody(e,t);break;case 10:n===E.BLOCKQUOTE||n===E.FIGCAPTION?addressEndTagInBody(e,t):genericEndTagInBody(e,t);break;default:genericEndTagInBody(e,t)}}function eofInBody(e,t){e.tmplInsertionModeStackTop>-1?eofInTemplate(e,t):e.stopped=!0}function characterInTable(e,t){let n=e.openElements.currentTagName;n===E.TABLE||n===E.TBODY||n===E.TFOOT||n===E.THEAD||n===E.TR?(e.pendingCharacterTokens=[],e.hasNonWhitespacePendingCharacterToken=!1,e.originalInsertionMode=e.insertionMode,e.insertionMode=I,e._processToken(t)):tokenInTable(e,t)}function startTagInTable(e,t){let n=t.tagName;switch(n.length){case 2:n===E.TD||n===E.TH||n===E.TR?(e.openElements.clearBackToTableContext(),e._insertFakeElement(E.TBODY),e.insertionMode=F,e._processToken(t)):tokenInTable(e,t);break;case 3:n===E.COL?(e.openElements.clearBackToTableContext(),e._insertFakeElement(E.COLGROUP),e.insertionMode=R,e._processToken(t)):tokenInTable(e,t);break;case 4:n===E.FORM?e.formElement||0!==e.openElements.tmplCount||(e._insertElement(t,b.HTML),e.formElement=e.openElements.current,e.openElements.pop()):tokenInTable(e,t);break;case 5:n===E.TABLE?e.openElements.hasInTableScope(E.TABLE)&&(e.openElements.popUntilTagNamePopped(E.TABLE),e._resetInsertionMode(),e._processToken(t)):n===E.STYLE?startTagInHead(e,t):n===E.TBODY||n===E.TFOOT||n===E.THEAD?(e.openElements.clearBackToTableContext(),e._insertElement(t,b.HTML),e.insertionMode=F):n===E.INPUT?function(e,t){let n=r.getTokenAttr(t,T.TYPE);n&&n.toLowerCase()===A?e._appendElement(t,b.HTML):tokenInTable(e,t),t.ackSelfClosing=!0}(e,t):tokenInTable(e,t);break;case 6:n===E.SCRIPT?startTagInHead(e,t):tokenInTable(e,t);break;case 7:n===E.CAPTION?(e.openElements.clearBackToTableContext(),e.activeFormattingElements.insertMarker(),e._insertElement(t,b.HTML),e.insertionMode=w):tokenInTable(e,t);break;case 8:n===E.COLGROUP?(e.openElements.clearBackToTableContext(),e._insertElement(t,b.HTML),e.insertionMode=R):n===E.TEMPLATE?startTagInHead(e,t):tokenInTable(e,t);break;default:tokenInTable(e,t)}}function endTagInTable(e,t){let n=t.tagName;n===E.TABLE?e.openElements.hasInTableScope(E.TABLE)&&(e.openElements.popUntilTagNamePopped(E.TABLE),e._resetInsertionMode()):n===E.TEMPLATE?endTagInHead(e,t):n!==E.BODY&&n!==E.CAPTION&&n!==E.COL&&n!==E.COLGROUP&&n!==E.HTML&&n!==E.TBODY&&n!==E.TD&&n!==E.TFOOT&&n!==E.TH&&n!==E.THEAD&&n!==E.TR&&tokenInTable(e,t)}function tokenInTable(e,t){let n=e.fosterParentingEnabled;e.fosterParentingEnabled=!0,e._processTokenInBodyMode(t),e.fosterParentingEnabled=n}function tokenInTableText(e,t){let n=0;if(e.hasNonWhitespacePendingCharacterToken)for(;n0?(e.openElements.popUntilTagNamePopped(E.TEMPLATE),e.activeFormattingElements.clearToLastMarker(),e._popTmplInsertionMode(),e._resetInsertionMode(),e._processToken(t)):e.stopped=!0}function tokenAfterBody(e,t){e.insertionMode=x,e._processToken(t)}function tokenAfterAfterBody(e,t){e.insertionMode=x,e._processToken(t)}e.exports=class{constructor(e){this.options=u(_,e),this.treeAdapter=this.options.treeAdapter,this.pendingScript=null,this.options.sourceCodeLocationInfo&&l.install(this,o),this.options.onParseError&&l.install(this,s,{onParseError:this.options.onParseError})}parse(e){let t=this.treeAdapter.createDocument();return this._bootstrap(t,null),this.tokenizer.write(e,!0),this._runParsingLoop(null),t}parseFragment(e,t){t||(t=this.treeAdapter.createElement(E.TEMPLATE,b.HTML,[]));let n=this.treeAdapter.createElement("documentmock",b.HTML,[]);this._bootstrap(n,t),this.treeAdapter.getTagName(t)===E.TEMPLATE&&this._pushTmplInsertionMode(H),this._initTokenizerForFragmentParsing(),this._insertFakeRootElement(),this._resetInsertionMode(),this._findFormInFragmentContext(),this.tokenizer.write(e,!0),this._runParsingLoop(null);let r=this.treeAdapter.getFirstChild(n),i=this.treeAdapter.createDocumentFragment();return this._adoptNodes(r,i),i}_bootstrap(e,t){this.tokenizer=new r(this.options),this.stopped=!1,this.insertionMode=C,this.originalInsertionMode="",this.document=e,this.fragmentContext=t,this.headElement=null,this.formElement=null,this.openElements=new i(this.document,this.treeAdapter),this.activeFormattingElements=new a(this.treeAdapter),this.tmplInsertionModeStack=[],this.tmplInsertionModeStackTop=-1,this.currentTmplInsertionMode=null,this.pendingCharacterTokens=[],this.hasNonWhitespacePendingCharacterToken=!1,this.framesetOk=!0,this.skipNextNewLine=!1,this.fosterParentingEnabled=!1}_err(){}_runParsingLoop(e){for(;!this.stopped;){this._setupTokenizerCDATAMode();let t=this.tokenizer.getNextToken();if(t.type===r.HIBERNATION_TOKEN)break;if(this.skipNextNewLine&&(this.skipNextNewLine=!1,t.type===r.WHITESPACE_CHARACTER_TOKEN&&"\n"===t.chars[0])){if(1===t.chars.length)continue;t.chars=t.chars.substr(1)}if(this._processInputToken(t),e&&this.pendingScript)break}}runParsingLoopForCurrentChunk(e,t){if(this._runParsingLoop(t),t&&this.pendingScript){let e=this.pendingScript;this.pendingScript=null,t(e);return}e&&e()}_setupTokenizerCDATAMode(){let e=this._getAdjustedCurrentElement();this.tokenizer.allowCDATA=e&&e!==this.document&&this.treeAdapter.getNamespaceURI(e)!==b.HTML&&!this._isIntegrationPoint(e)}_switchToTextParsing(e,t){this._insertElement(e,b.HTML),this.tokenizer.state=t,this.originalInsertionMode=this.insertionMode,this.insertionMode=O}switchToPlaintextParsing(){this.insertionMode=O,this.originalInsertionMode=x,this.tokenizer.state=r.MODE.PLAINTEXT}_getAdjustedCurrentElement(){return 0===this.openElements.stackTop&&this.fragmentContext?this.fragmentContext:this.openElements.current}_findFormInFragmentContext(){let e=this.fragmentContext;do{if(this.treeAdapter.getTagName(e)===E.FORM){this.formElement=e;break}e=this.treeAdapter.getParentNode(e)}while(e)}_initTokenizerForFragmentParsing(){if(this.treeAdapter.getNamespaceURI(this.fragmentContext)===b.HTML){let e=this.treeAdapter.getTagName(this.fragmentContext);e===E.TITLE||e===E.TEXTAREA?this.tokenizer.state=r.MODE.RCDATA:e===E.STYLE||e===E.XMP||e===E.IFRAME||e===E.NOEMBED||e===E.NOFRAMES||e===E.NOSCRIPT?this.tokenizer.state=r.MODE.RAWTEXT:e===E.SCRIPT?this.tokenizer.state=r.MODE.SCRIPT_DATA:e===E.PLAINTEXT&&(this.tokenizer.state=r.MODE.PLAINTEXT)}}_setDocumentType(e){let t=e.name||"",n=e.publicId||"",r=e.systemId||"";this.treeAdapter.setDocumentType(this.document,t,n,r)}_attachElementToTree(e){if(this._shouldFosterParentOnInsertion())this._fosterParentElement(e);else{let t=this.openElements.currentTmplContent||this.openElements.current;this.treeAdapter.appendChild(t,e)}}_appendElement(e,t){let n=this.treeAdapter.createElement(e.tagName,t,e.attrs);this._attachElementToTree(n)}_insertElement(e,t){let n=this.treeAdapter.createElement(e.tagName,t,e.attrs);this._attachElementToTree(n),this.openElements.push(n)}_insertFakeElement(e){let t=this.treeAdapter.createElement(e,b.HTML,[]);this._attachElementToTree(t),this.openElements.push(t)}_insertTemplate(e){let t=this.treeAdapter.createElement(e.tagName,b.HTML,e.attrs),n=this.treeAdapter.createDocumentFragment();this.treeAdapter.setTemplateContent(t,n),this._attachElementToTree(t),this.openElements.push(t)}_insertFakeRootElement(){let e=this.treeAdapter.createElement(E.HTML,b.HTML,[]);this.treeAdapter.appendChild(this.openElements.current,e),this.openElements.push(e)}_appendCommentNode(e,t){let n=this.treeAdapter.createCommentNode(e.data);this.treeAdapter.appendChild(t,n)}_insertCharacters(e){if(this._shouldFosterParentOnInsertion())this._fosterParentText(e.chars);else{let t=this.openElements.currentTmplContent||this.openElements.current;this.treeAdapter.insertText(t,e.chars)}}_adoptNodes(e,t){for(let n=this.treeAdapter.getFirstChild(e);n;n=this.treeAdapter.getFirstChild(e))this.treeAdapter.detachNode(n),this.treeAdapter.appendChild(t,n)}_shouldProcessTokenInForeignContent(e){let t=this._getAdjustedCurrentElement();if(!t||t===this.document)return!1;let n=this.treeAdapter.getNamespaceURI(t);if(n===b.HTML||this.treeAdapter.getTagName(t)===E.ANNOTATION_XML&&n===b.MATHML&&e.type===r.START_TAG_TOKEN&&e.tagName===E.SVG)return!1;let i=e.type===r.CHARACTER_TOKEN||e.type===r.NULL_CHARACTER_TOKEN||e.type===r.WHITESPACE_CHARACTER_TOKEN,a=e.type===r.START_TAG_TOKEN&&e.tagName!==E.MGLYPH&&e.tagName!==E.MALIGNMARK;return!((a||i)&&this._isIntegrationPoint(t,b.MATHML)||(e.type===r.START_TAG_TOKEN||i)&&this._isIntegrationPoint(t,b.HTML))&&e.type!==r.EOF_TOKEN}_processToken(e){W[this.insertionMode][e.type](this,e)}_processTokenInBodyMode(e){W[x][e.type](this,e)}_processTokenInForeignContent(e){e.type===r.CHARACTER_TOKEN?(this._insertCharacters(e),this.framesetOk=!1):e.type===r.NULL_CHARACTER_TOKEN?(e.chars=m.REPLACEMENT_CHARACTER,this._insertCharacters(e)):e.type===r.WHITESPACE_CHARACTER_TOKEN?insertCharacters(this,e):e.type===r.COMMENT_TOKEN?appendComment(this,e):e.type===r.START_TAG_TOKEN?function(e,t){if(p.causesExit(t)&&!e.fragmentContext){for(;e.treeAdapter.getNamespaceURI(e.openElements.current)!==b.HTML&&!e._isIntegrationPoint(e.openElements.current);)e.openElements.pop();e._processToken(t)}else{let n=e._getAdjustedCurrentElement(),r=e.treeAdapter.getNamespaceURI(n);r===b.MATHML?p.adjustTokenMathMLAttrs(t):r===b.SVG&&(p.adjustTokenSVGTagName(t),p.adjustTokenSVGAttrs(t)),p.adjustTokenXMLAttrs(t),t.selfClosing?e._appendElement(t,r):e._insertElement(t,r),t.ackSelfClosing=!0}}(this,e):e.type===r.END_TAG_TOKEN&&function(e,t){for(let n=e.openElements.stackTop;n>0;n--){let r=e.openElements.items[n];if(e.treeAdapter.getNamespaceURI(r)===b.HTML){e._processToken(t);break}if(e.treeAdapter.getTagName(r).toLowerCase()===t.tagName){e.openElements.popUntilElementPopped(r);break}}}(this,e)}_processInputToken(e){this._shouldProcessTokenInForeignContent(e)?this._processTokenInForeignContent(e):this._processToken(e),e.type===r.START_TAG_TOKEN&&e.selfClosing&&!e.ackSelfClosing&&this._err(f.nonVoidHtmlElementStartTagWithTrailingSolidus)}_isIntegrationPoint(e,t){let n=this.treeAdapter.getTagName(e),r=this.treeAdapter.getNamespaceURI(e),i=this.treeAdapter.getAttrList(e);return p.isIntegrationPoint(n,r,i,t)}_reconstructActiveFormattingElements(){let e=this.activeFormattingElements.length;if(e){let t=e,n=null;do if(t--,(n=this.activeFormattingElements.entries[t]).type===a.MARKER_ENTRY||this.openElements.contains(n.element)){t++;break}while(t>0);for(let r=t;r=0;e--){let n=this.openElements.items[e];0===e&&(t=!0,this.fragmentContext&&(n=this.fragmentContext));let r=this.treeAdapter.getTagName(n),i=q[r];if(i){this.insertionMode=i;break}if(t||r!==E.TD&&r!==E.TH){if(t||r!==E.HEAD){if(r===E.SELECT){this._resetInsertionModeForSelect(e);break}if(r===E.TEMPLATE){this.insertionMode=this.currentTmplInsertionMode;break}if(r===E.HTML){this.insertionMode=this.headElement?D:k;break}else if(t){this.insertionMode=x;break}}else{this.insertionMode=N;break}}else{this.insertionMode=L;break}}}_resetInsertionModeForSelect(e){if(e>0)for(let t=e-1;t>0;t--){let e=this.openElements.items[t],n=this.treeAdapter.getTagName(e);if(n===E.TEMPLATE)break;if(n===E.TABLE){this.insertionMode=P;return}}this.insertionMode=B}_pushTmplInsertionMode(e){this.tmplInsertionModeStack.push(e),this.tmplInsertionModeStackTop++,this.currentTmplInsertionMode=e}_popTmplInsertionMode(){this.tmplInsertionModeStack.pop(),this.tmplInsertionModeStackTop--,this.currentTmplInsertionMode=this.tmplInsertionModeStack[this.tmplInsertionModeStackTop]}_isElementCausesFosterParenting(e){let t=this.treeAdapter.getTagName(e);return t===E.TABLE||t===E.TBODY||t===E.TFOOT||t===E.THEAD||t===E.TR}_shouldFosterParentOnInsertion(){return this.fosterParentingEnabled&&this._isElementCausesFosterParenting(this.openElements.current)}_findFosterParentingLocation(){let e={parent:null,beforeElement:null};for(let t=this.openElements.stackTop;t>=0;t--){let n=this.openElements.items[t],r=this.treeAdapter.getTagName(n),i=this.treeAdapter.getNamespaceURI(n);if(r===E.TEMPLATE&&i===b.HTML){e.parent=this.treeAdapter.getTemplateContent(n);break}if(r===E.TABLE){e.parent=this.treeAdapter.getParentNode(n),e.parent?e.beforeElement=n:e.parent=this.openElements.items[t-1];break}}return e.parent||(e.parent=this.openElements.items[0]),e}_fosterParentElement(e){let t=this._findFosterParentingLocation();t.beforeElement?this.treeAdapter.insertBefore(t.parent,e,t.beforeElement):this.treeAdapter.appendChild(t.parent,e)}_fosterParentText(e){let t=this._findFosterParentingLocation();t.beforeElement?this.treeAdapter.insertTextBefore(t.parent,e,t.beforeElement):this.treeAdapter.insertText(t.parent,e)}_isSpecialElement(e){let t=this.treeAdapter.getTagName(e),n=this.treeAdapter.getNamespaceURI(e);return g.SPECIAL_ELEMENTS[n][t]}}},46519:function(e,t,n){"use strict";let r=n(16152),i=r.TAG_NAMES,a=r.NAMESPACES;function isImpliedEndTagRequired(e){switch(e.length){case 1:return e===i.P;case 2:return e===i.RB||e===i.RP||e===i.RT||e===i.DD||e===i.DT||e===i.LI;case 3:return e===i.RTC;case 6:return e===i.OPTION;case 8:return e===i.OPTGROUP}return!1}function isScopingElement(e,t){switch(e.length){case 2:if(e===i.TD||e===i.TH)return t===a.HTML;if(e===i.MI||e===i.MO||e===i.MN||e===i.MS)return t===a.MATHML;break;case 4:if(e===i.HTML)return t===a.HTML;if(e===i.DESC)return t===a.SVG;break;case 5:if(e===i.TABLE)return t===a.HTML;if(e===i.MTEXT)return t===a.MATHML;if(e===i.TITLE)return t===a.SVG;break;case 6:return(e===i.APPLET||e===i.OBJECT)&&t===a.HTML;case 7:return(e===i.CAPTION||e===i.MARQUEE)&&t===a.HTML;case 8:return e===i.TEMPLATE&&t===a.HTML;case 13:return e===i.FOREIGN_OBJECT&&t===a.SVG;case 14:return e===i.ANNOTATION_XML&&t===a.MATHML}return!1}e.exports=class{constructor(e,t){this.stackTop=-1,this.items=[],this.current=e,this.currentTagName=null,this.currentTmplContent=null,this.tmplCount=0,this.treeAdapter=t}_indexOf(e){let t=-1;for(let n=this.stackTop;n>=0;n--)if(this.items[n]===e){t=n;break}return t}_isInTemplate(){return this.currentTagName===i.TEMPLATE&&this.treeAdapter.getNamespaceURI(this.current)===a.HTML}_updateCurrentElement(){this.current=this.items[this.stackTop],this.currentTagName=this.current&&this.treeAdapter.getTagName(this.current),this.currentTmplContent=this._isInTemplate()?this.treeAdapter.getTemplateContent(this.current):null}push(e){this.items[++this.stackTop]=e,this._updateCurrentElement(),this._isInTemplate()&&this.tmplCount++}pop(){this.stackTop--,this.tmplCount>0&&this._isInTemplate()&&this.tmplCount--,this._updateCurrentElement()}replace(e,t){let n=this._indexOf(e);this.items[n]=t,n===this.stackTop&&this._updateCurrentElement()}insertAfter(e,t){let n=this._indexOf(e)+1;this.items.splice(n,0,t),n===++this.stackTop&&this._updateCurrentElement()}popUntilTagNamePopped(e){for(;this.stackTop>-1;){let t=this.currentTagName,n=this.treeAdapter.getNamespaceURI(this.current);if(this.pop(),t===e&&n===a.HTML)break}}popUntilElementPopped(e){for(;this.stackTop>-1;){let t=this.current;if(this.pop(),t===e)break}}popUntilNumberedHeaderPopped(){for(;this.stackTop>-1;){let e=this.currentTagName,t=this.treeAdapter.getNamespaceURI(this.current);if(this.pop(),e===i.H1||e===i.H2||e===i.H3||e===i.H4||e===i.H5||e===i.H6&&t===a.HTML)break}}popUntilTableCellPopped(){for(;this.stackTop>-1;){let e=this.currentTagName,t=this.treeAdapter.getNamespaceURI(this.current);if(this.pop(),e===i.TD||e===i.TH&&t===a.HTML)break}}popAllUpToHtmlElement(){this.stackTop=0,this._updateCurrentElement()}clearBackToTableContext(){for(;this.currentTagName!==i.TABLE&&this.currentTagName!==i.TEMPLATE&&this.currentTagName!==i.HTML||this.treeAdapter.getNamespaceURI(this.current)!==a.HTML;)this.pop()}clearBackToTableBodyContext(){for(;this.currentTagName!==i.TBODY&&this.currentTagName!==i.TFOOT&&this.currentTagName!==i.THEAD&&this.currentTagName!==i.TEMPLATE&&this.currentTagName!==i.HTML||this.treeAdapter.getNamespaceURI(this.current)!==a.HTML;)this.pop()}clearBackToTableRowContext(){for(;this.currentTagName!==i.TR&&this.currentTagName!==i.TEMPLATE&&this.currentTagName!==i.HTML||this.treeAdapter.getNamespaceURI(this.current)!==a.HTML;)this.pop()}remove(e){for(let t=this.stackTop;t>=0;t--)if(this.items[t]===e){this.items.splice(t,1),this.stackTop--,this._updateCurrentElement();break}}tryPeekProperlyNestedBodyElement(){let e=this.items[1];return e&&this.treeAdapter.getTagName(e)===i.BODY?e:null}contains(e){return this._indexOf(e)>-1}getCommonAncestor(e){let t=this._indexOf(e);return--t>=0?this.items[t]:null}isRootHtmlElementCurrent(){return 0===this.stackTop&&this.currentTagName===i.HTML}hasInScope(e){for(let t=this.stackTop;t>=0;t--){let n=this.treeAdapter.getTagName(this.items[t]),r=this.treeAdapter.getNamespaceURI(this.items[t]);if(n===e&&r===a.HTML)break;if(isScopingElement(n,r))return!1}return!0}hasNumberedHeaderInScope(){for(let e=this.stackTop;e>=0;e--){let t=this.treeAdapter.getTagName(this.items[e]),n=this.treeAdapter.getNamespaceURI(this.items[e]);if((t===i.H1||t===i.H2||t===i.H3||t===i.H4||t===i.H5||t===i.H6)&&n===a.HTML)break;if(isScopingElement(t,n))return!1}return!0}hasInListItemScope(e){for(let t=this.stackTop;t>=0;t--){let n=this.treeAdapter.getTagName(this.items[t]),r=this.treeAdapter.getNamespaceURI(this.items[t]);if(n===e&&r===a.HTML)break;if((n===i.UL||n===i.OL)&&r===a.HTML||isScopingElement(n,r))return!1}return!0}hasInButtonScope(e){for(let t=this.stackTop;t>=0;t--){let n=this.treeAdapter.getTagName(this.items[t]),r=this.treeAdapter.getNamespaceURI(this.items[t]);if(n===e&&r===a.HTML)break;if(n===i.BUTTON&&r===a.HTML||isScopingElement(n,r))return!1}return!0}hasInTableScope(e){for(let t=this.stackTop;t>=0;t--){let n=this.treeAdapter.getTagName(this.items[t]),r=this.treeAdapter.getNamespaceURI(this.items[t]);if(r===a.HTML){if(n===e)break;if(n===i.TABLE||n===i.TEMPLATE||n===i.HTML)return!1}}return!0}hasTableBodyContextInTableScope(){for(let e=this.stackTop;e>=0;e--){let t=this.treeAdapter.getTagName(this.items[e]),n=this.treeAdapter.getNamespaceURI(this.items[e]);if(n===a.HTML){if(t===i.TBODY||t===i.THEAD||t===i.TFOOT)break;if(t===i.TABLE||t===i.HTML)return!1}}return!0}hasInSelectScope(e){for(let t=this.stackTop;t>=0;t--){let n=this.treeAdapter.getTagName(this.items[t]),r=this.treeAdapter.getNamespaceURI(this.items[t]);if(r===a.HTML){if(n===e)break;if(n!==i.OPTION&&n!==i.OPTGROUP)return!1}}return!0}generateImpliedEndTags(){for(;isImpliedEndTagRequired(this.currentTagName);)this.pop()}generateImpliedEndTagsThoroughly(){for(;function(e){switch(e.length){case 1:return e===i.P;case 2:return e===i.RB||e===i.RP||e===i.RT||e===i.DD||e===i.DT||e===i.LI||e===i.TD||e===i.TH||e===i.TR;case 3:return e===i.RTC;case 5:return e===i.TBODY||e===i.TFOOT||e===i.THEAD;case 6:return e===i.OPTION;case 7:return e===i.CAPTION;case 8:return e===i.OPTGROUP||e===i.COLGROUP}return!1}(this.currentTagName);)this.pop()}generateImpliedEndTagsWithExclusion(e){for(;isImpliedEndTagRequired(this.currentTagName)&&this.currentTagName!==e;)this.pop()}}},55763:function(e,t,n){"use strict";let r=n(77118),i=n(54284),a=n(5482),o=n(41734),s=i.CODE_POINTS,l=i.CODE_POINT_SEQUENCES,c={128:8364,130:8218,131:402,132:8222,133:8230,134:8224,135:8225,136:710,137:8240,138:352,139:8249,140:338,142:381,145:8216,146:8217,147:8220,148:8221,149:8226,150:8211,151:8212,152:732,153:8482,154:353,155:8250,156:339,158:382,159:376},u="DATA_STATE",d="RCDATA_STATE",p="RAWTEXT_STATE",f="SCRIPT_DATA_STATE",m="PLAINTEXT_STATE",g="TAG_OPEN_STATE",E="END_TAG_OPEN_STATE",b="TAG_NAME_STATE",T="RCDATA_LESS_THAN_SIGN_STATE",_="RCDATA_END_TAG_OPEN_STATE",A="RCDATA_END_TAG_NAME_STATE",C="RAWTEXT_LESS_THAN_SIGN_STATE",y="RAWTEXT_END_TAG_OPEN_STATE",k="RAWTEXT_END_TAG_NAME_STATE",N="SCRIPT_DATA_LESS_THAN_SIGN_STATE",S="SCRIPT_DATA_END_TAG_OPEN_STATE",D="SCRIPT_DATA_END_TAG_NAME_STATE",x="SCRIPT_DATA_ESCAPE_START_STATE",O="SCRIPT_DATA_ESCAPE_START_DASH_STATE",v="SCRIPT_DATA_ESCAPED_STATE",I="SCRIPT_DATA_ESCAPED_DASH_STATE",w="SCRIPT_DATA_ESCAPED_DASH_DASH_STATE",R="SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE",F="SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE",M="SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE",L="SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE",B="SCRIPT_DATA_DOUBLE_ESCAPED_STATE",P="SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE",H="SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE",U="SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE",z="SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE",G="BEFORE_ATTRIBUTE_NAME_STATE",K="ATTRIBUTE_NAME_STATE",j="AFTER_ATTRIBUTE_NAME_STATE",q="BEFORE_ATTRIBUTE_VALUE_STATE",$="ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE",W="ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE",V="ATTRIBUTE_VALUE_UNQUOTED_STATE",Q="AFTER_ATTRIBUTE_VALUE_QUOTED_STATE",Y="SELF_CLOSING_START_TAG_STATE",Z="BOGUS_COMMENT_STATE",X="MARKUP_DECLARATION_OPEN_STATE",J="COMMENT_START_STATE",ee="COMMENT_START_DASH_STATE",et="COMMENT_STATE",en="COMMENT_LESS_THAN_SIGN_STATE",er="COMMENT_LESS_THAN_SIGN_BANG_STATE",ei="COMMENT_LESS_THAN_SIGN_BANG_DASH_STATE",ea="COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH_STATE",eo="COMMENT_END_DASH_STATE",es="COMMENT_END_STATE",el="COMMENT_END_BANG_STATE",ec="DOCTYPE_STATE",eu="BEFORE_DOCTYPE_NAME_STATE",ed="DOCTYPE_NAME_STATE",ep="AFTER_DOCTYPE_NAME_STATE",eh="AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE",ef="BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE",em="DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE",eg="DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE",eE="AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE",eb="BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE",eT="AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE",e_="BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE",eA="DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE",eC="DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE",ey="AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE",ek="BOGUS_DOCTYPE_STATE",eN="CDATA_SECTION_STATE",eS="CDATA_SECTION_BRACKET_STATE",eD="CDATA_SECTION_END_STATE",ex="CHARACTER_REFERENCE_STATE",eO="NAMED_CHARACTER_REFERENCE_STATE",ev="AMBIGUOS_AMPERSAND_STATE",eI="NUMERIC_CHARACTER_REFERENCE_STATE",ew="HEXADEMICAL_CHARACTER_REFERENCE_START_STATE",eR="DECIMAL_CHARACTER_REFERENCE_START_STATE",eF="HEXADEMICAL_CHARACTER_REFERENCE_STATE",eM="DECIMAL_CHARACTER_REFERENCE_STATE",eL="NUMERIC_CHARACTER_REFERENCE_END_STATE";function isWhitespace(e){return e===s.SPACE||e===s.LINE_FEED||e===s.TABULATION||e===s.FORM_FEED}function isAsciiDigit(e){return e>=s.DIGIT_0&&e<=s.DIGIT_9}function isAsciiUpper(e){return e>=s.LATIN_CAPITAL_A&&e<=s.LATIN_CAPITAL_Z}function isAsciiLower(e){return e>=s.LATIN_SMALL_A&&e<=s.LATIN_SMALL_Z}function isAsciiLetter(e){return isAsciiLower(e)||isAsciiUpper(e)}function isAsciiAlphaNumeric(e){return isAsciiLetter(e)||isAsciiDigit(e)}function isAsciiUpperHexDigit(e){return e>=s.LATIN_CAPITAL_A&&e<=s.LATIN_CAPITAL_F}function isAsciiLowerHexDigit(e){return e>=s.LATIN_SMALL_A&&e<=s.LATIN_SMALL_F}function toChar(e){return e<=65535?String.fromCharCode(e):String.fromCharCode((e-=65536)>>>10&1023|55296)+String.fromCharCode(56320|1023&e)}function toAsciiLowerChar(e){return String.fromCharCode(e+32)}function findNamedEntityTreeBranch(e,t){let n=a[++e],r=++e,i=r+n-1;for(;r<=i;){let e=r+i>>>1,o=a[e];if(ot))return a[e+n];i=e-1}}return -1}let Tokenizer=class Tokenizer{constructor(){this.preprocessor=new r,this.tokenQueue=[],this.allowCDATA=!1,this.state=u,this.returnState="",this.charRefCode=-1,this.tempBuff=[],this.lastStartTagName="",this.consumedAfterSnapshot=-1,this.active=!1,this.currentCharacterToken=null,this.currentToken=null,this.currentAttr=null}_err(){}_errOnNextCodePoint(e){this._consume(),this._err(e),this._unconsume()}getNextToken(){for(;!this.tokenQueue.length&&this.active;){this.consumedAfterSnapshot=0;let e=this._consume();this._ensureHibernation()||this[this.state](e)}return this.tokenQueue.shift()}write(e,t){this.active=!0,this.preprocessor.write(e,t)}insertHtmlAtCurrentPos(e){this.active=!0,this.preprocessor.insertHtmlAtCurrentPos(e)}_ensureHibernation(){if(this.preprocessor.endOfChunkHit){for(;this.consumedAfterSnapshot>0;this.consumedAfterSnapshot--)this.preprocessor.retreat();return this.active=!1,this.tokenQueue.push({type:Tokenizer.HIBERNATION_TOKEN}),!0}return!1}_consume(){return this.consumedAfterSnapshot++,this.preprocessor.advance()}_unconsume(){this.consumedAfterSnapshot--,this.preprocessor.retreat()}_reconsumeInState(e){this.state=e,this._unconsume()}_consumeSequenceIfMatch(e,t,n){let r,i=0,a=!0,o=e.length,l=0,c=t;for(;l0&&(c=this._consume(),i++),c===s.EOF||c!==(r=e[l])&&(n||c!==r+32)){a=!1;break}if(!a)for(;i--;)this._unconsume();return a}_isTempBufferEqualToScriptString(){if(this.tempBuff.length!==l.SCRIPT_STRING.length)return!1;for(let e=0;e0&&this._err(o.endTagWithAttributes),e.selfClosing&&this._err(o.endTagWithTrailingSolidus)),this.tokenQueue.push(e)}_emitCurrentCharacterToken(){this.currentCharacterToken&&(this.tokenQueue.push(this.currentCharacterToken),this.currentCharacterToken=null)}_emitEOFToken(){this._createEOFToken(),this._emitCurrentToken()}_appendCharToCurrentCharacterToken(e,t){this.currentCharacterToken&&this.currentCharacterToken.type!==e&&this._emitCurrentCharacterToken(),this.currentCharacterToken?this.currentCharacterToken.chars+=t:this._createCharacterToken(e,t)}_emitCodePoint(e){let t=Tokenizer.CHARACTER_TOKEN;isWhitespace(e)?t=Tokenizer.WHITESPACE_CHARACTER_TOKEN:e===s.NULL&&(t=Tokenizer.NULL_CHARACTER_TOKEN),this._appendCharToCurrentCharacterToken(t,toChar(e))}_emitSeveralCodePoints(e){for(let t=0;t-1;){let e=a[r],i=e<7,o=i&&1&e;o&&(t=2&e?[a[++r],a[++r]]:[a[++r]],n=0);let l=this._consume();if(this.tempBuff.push(l),n++,l===s.EOF)break;r=i?4&e?findNamedEntityTreeBranch(r,l):-1:l===e?++r:-1}for(;n--;)this.tempBuff.pop(),this._unconsume();return t}_isCharacterReferenceInAttribute(){return this.returnState===$||this.returnState===W||this.returnState===V}_isCharacterReferenceAttributeQuirk(e){if(!e&&this._isCharacterReferenceInAttribute()){let e=this._consume();return this._unconsume(),e===s.EQUALS_SIGN||isAsciiAlphaNumeric(e)}return!1}_flushCodePointsConsumedAsCharacterReference(){if(this._isCharacterReferenceInAttribute())for(let e=0;e")):e===s.NULL?(this._err(o.unexpectedNullCharacter),this.state=v,this._emitChars(i.REPLACEMENT_CHARACTER)):e===s.EOF?(this._err(o.eofInScriptHtmlCommentLikeText),this._emitEOFToken()):(this.state=v,this._emitCodePoint(e))}[R](e){e===s.SOLIDUS?(this.tempBuff=[],this.state=F):isAsciiLetter(e)?(this.tempBuff=[],this._emitChars("<"),this._reconsumeInState(L)):(this._emitChars("<"),this._reconsumeInState(v))}[F](e){isAsciiLetter(e)?(this._createEndTagToken(),this._reconsumeInState(M)):(this._emitChars("")):e===s.NULL?(this._err(o.unexpectedNullCharacter),this.state=B,this._emitChars(i.REPLACEMENT_CHARACTER)):e===s.EOF?(this._err(o.eofInScriptHtmlCommentLikeText),this._emitEOFToken()):(this.state=B,this._emitCodePoint(e))}[U](e){e===s.SOLIDUS?(this.tempBuff=[],this.state=z,this._emitChars("/")):this._reconsumeInState(B)}[z](e){isWhitespace(e)||e===s.SOLIDUS||e===s.GREATER_THAN_SIGN?(this.state=this._isTempBufferEqualToScriptString()?v:B,this._emitCodePoint(e)):isAsciiUpper(e)?(this.tempBuff.push(e+32),this._emitCodePoint(e)):isAsciiLower(e)?(this.tempBuff.push(e),this._emitCodePoint(e)):this._reconsumeInState(B)}[G](e){isWhitespace(e)||(e===s.SOLIDUS||e===s.GREATER_THAN_SIGN||e===s.EOF?this._reconsumeInState(j):e===s.EQUALS_SIGN?(this._err(o.unexpectedEqualsSignBeforeAttributeName),this._createAttr("="),this.state=K):(this._createAttr(""),this._reconsumeInState(K)))}[K](e){isWhitespace(e)||e===s.SOLIDUS||e===s.GREATER_THAN_SIGN||e===s.EOF?(this._leaveAttrName(j),this._unconsume()):e===s.EQUALS_SIGN?this._leaveAttrName(q):isAsciiUpper(e)?this.currentAttr.name+=toAsciiLowerChar(e):e===s.QUOTATION_MARK||e===s.APOSTROPHE||e===s.LESS_THAN_SIGN?(this._err(o.unexpectedCharacterInAttributeName),this.currentAttr.name+=toChar(e)):e===s.NULL?(this._err(o.unexpectedNullCharacter),this.currentAttr.name+=i.REPLACEMENT_CHARACTER):this.currentAttr.name+=toChar(e)}[j](e){isWhitespace(e)||(e===s.SOLIDUS?this.state=Y:e===s.EQUALS_SIGN?this.state=q:e===s.GREATER_THAN_SIGN?(this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(o.eofInTag),this._emitEOFToken()):(this._createAttr(""),this._reconsumeInState(K)))}[q](e){isWhitespace(e)||(e===s.QUOTATION_MARK?this.state=$:e===s.APOSTROPHE?this.state=W:e===s.GREATER_THAN_SIGN?(this._err(o.missingAttributeValue),this.state=u,this._emitCurrentToken()):this._reconsumeInState(V))}[$](e){e===s.QUOTATION_MARK?this.state=Q:e===s.AMPERSAND?(this.returnState=$,this.state=ex):e===s.NULL?(this._err(o.unexpectedNullCharacter),this.currentAttr.value+=i.REPLACEMENT_CHARACTER):e===s.EOF?(this._err(o.eofInTag),this._emitEOFToken()):this.currentAttr.value+=toChar(e)}[W](e){e===s.APOSTROPHE?this.state=Q:e===s.AMPERSAND?(this.returnState=W,this.state=ex):e===s.NULL?(this._err(o.unexpectedNullCharacter),this.currentAttr.value+=i.REPLACEMENT_CHARACTER):e===s.EOF?(this._err(o.eofInTag),this._emitEOFToken()):this.currentAttr.value+=toChar(e)}[V](e){isWhitespace(e)?this._leaveAttrValue(G):e===s.AMPERSAND?(this.returnState=V,this.state=ex):e===s.GREATER_THAN_SIGN?(this._leaveAttrValue(u),this._emitCurrentToken()):e===s.NULL?(this._err(o.unexpectedNullCharacter),this.currentAttr.value+=i.REPLACEMENT_CHARACTER):e===s.QUOTATION_MARK||e===s.APOSTROPHE||e===s.LESS_THAN_SIGN||e===s.EQUALS_SIGN||e===s.GRAVE_ACCENT?(this._err(o.unexpectedCharacterInUnquotedAttributeValue),this.currentAttr.value+=toChar(e)):e===s.EOF?(this._err(o.eofInTag),this._emitEOFToken()):this.currentAttr.value+=toChar(e)}[Q](e){isWhitespace(e)?this._leaveAttrValue(G):e===s.SOLIDUS?this._leaveAttrValue(Y):e===s.GREATER_THAN_SIGN?(this._leaveAttrValue(u),this._emitCurrentToken()):e===s.EOF?(this._err(o.eofInTag),this._emitEOFToken()):(this._err(o.missingWhitespaceBetweenAttributes),this._reconsumeInState(G))}[Y](e){e===s.GREATER_THAN_SIGN?(this.currentToken.selfClosing=!0,this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(o.eofInTag),this._emitEOFToken()):(this._err(o.unexpectedSolidusInTag),this._reconsumeInState(G))}[Z](e){e===s.GREATER_THAN_SIGN?(this.state=u,this._emitCurrentToken()):e===s.EOF?(this._emitCurrentToken(),this._emitEOFToken()):e===s.NULL?(this._err(o.unexpectedNullCharacter),this.currentToken.data+=i.REPLACEMENT_CHARACTER):this.currentToken.data+=toChar(e)}[X](e){this._consumeSequenceIfMatch(l.DASH_DASH_STRING,e,!0)?(this._createCommentToken(),this.state=J):this._consumeSequenceIfMatch(l.DOCTYPE_STRING,e,!1)?this.state=ec:this._consumeSequenceIfMatch(l.CDATA_START_STRING,e,!0)?this.allowCDATA?this.state=eN:(this._err(o.cdataInHtmlContent),this._createCommentToken(),this.currentToken.data="[CDATA[",this.state=Z):this._ensureHibernation()||(this._err(o.incorrectlyOpenedComment),this._createCommentToken(),this._reconsumeInState(Z))}[J](e){e===s.HYPHEN_MINUS?this.state=ee:e===s.GREATER_THAN_SIGN?(this._err(o.abruptClosingOfEmptyComment),this.state=u,this._emitCurrentToken()):this._reconsumeInState(et)}[ee](e){e===s.HYPHEN_MINUS?this.state=es:e===s.GREATER_THAN_SIGN?(this._err(o.abruptClosingOfEmptyComment),this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(o.eofInComment),this._emitCurrentToken(),this._emitEOFToken()):(this.currentToken.data+="-",this._reconsumeInState(et))}[et](e){e===s.HYPHEN_MINUS?this.state=eo:e===s.LESS_THAN_SIGN?(this.currentToken.data+="<",this.state=en):e===s.NULL?(this._err(o.unexpectedNullCharacter),this.currentToken.data+=i.REPLACEMENT_CHARACTER):e===s.EOF?(this._err(o.eofInComment),this._emitCurrentToken(),this._emitEOFToken()):this.currentToken.data+=toChar(e)}[en](e){e===s.EXCLAMATION_MARK?(this.currentToken.data+="!",this.state=er):e===s.LESS_THAN_SIGN?this.currentToken.data+="!":this._reconsumeInState(et)}[er](e){e===s.HYPHEN_MINUS?this.state=ei:this._reconsumeInState(et)}[ei](e){e===s.HYPHEN_MINUS?this.state=ea:this._reconsumeInState(eo)}[ea](e){e!==s.GREATER_THAN_SIGN&&e!==s.EOF&&this._err(o.nestedComment),this._reconsumeInState(es)}[eo](e){e===s.HYPHEN_MINUS?this.state=es:e===s.EOF?(this._err(o.eofInComment),this._emitCurrentToken(),this._emitEOFToken()):(this.currentToken.data+="-",this._reconsumeInState(et))}[es](e){e===s.GREATER_THAN_SIGN?(this.state=u,this._emitCurrentToken()):e===s.EXCLAMATION_MARK?this.state=el:e===s.HYPHEN_MINUS?this.currentToken.data+="-":e===s.EOF?(this._err(o.eofInComment),this._emitCurrentToken(),this._emitEOFToken()):(this.currentToken.data+="--",this._reconsumeInState(et))}[el](e){e===s.HYPHEN_MINUS?(this.currentToken.data+="--!",this.state=eo):e===s.GREATER_THAN_SIGN?(this._err(o.incorrectlyClosedComment),this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(o.eofInComment),this._emitCurrentToken(),this._emitEOFToken()):(this.currentToken.data+="--!",this._reconsumeInState(et))}[ec](e){isWhitespace(e)?this.state=eu:e===s.GREATER_THAN_SIGN?this._reconsumeInState(eu):e===s.EOF?(this._err(o.eofInDoctype),this._createDoctypeToken(null),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(o.missingWhitespaceBeforeDoctypeName),this._reconsumeInState(eu))}[eu](e){isWhitespace(e)||(isAsciiUpper(e)?(this._createDoctypeToken(toAsciiLowerChar(e)),this.state=ed):e===s.NULL?(this._err(o.unexpectedNullCharacter),this._createDoctypeToken(i.REPLACEMENT_CHARACTER),this.state=ed):e===s.GREATER_THAN_SIGN?(this._err(o.missingDoctypeName),this._createDoctypeToken(null),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this.state=u):e===s.EOF?(this._err(o.eofInDoctype),this._createDoctypeToken(null),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._createDoctypeToken(toChar(e)),this.state=ed))}[ed](e){isWhitespace(e)?this.state=ep:e===s.GREATER_THAN_SIGN?(this.state=u,this._emitCurrentToken()):isAsciiUpper(e)?this.currentToken.name+=toAsciiLowerChar(e):e===s.NULL?(this._err(o.unexpectedNullCharacter),this.currentToken.name+=i.REPLACEMENT_CHARACTER):e===s.EOF?(this._err(o.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):this.currentToken.name+=toChar(e)}[ep](e){!isWhitespace(e)&&(e===s.GREATER_THAN_SIGN?(this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(o.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):this._consumeSequenceIfMatch(l.PUBLIC_STRING,e,!1)?this.state=eh:this._consumeSequenceIfMatch(l.SYSTEM_STRING,e,!1)?this.state=eT:this._ensureHibernation()||(this._err(o.invalidCharacterSequenceAfterDoctypeName),this.currentToken.forceQuirks=!0,this._reconsumeInState(ek)))}[eh](e){isWhitespace(e)?this.state=ef:e===s.QUOTATION_MARK?(this._err(o.missingWhitespaceAfterDoctypePublicKeyword),this.currentToken.publicId="",this.state=em):e===s.APOSTROPHE?(this._err(o.missingWhitespaceAfterDoctypePublicKeyword),this.currentToken.publicId="",this.state=eg):e===s.GREATER_THAN_SIGN?(this._err(o.missingDoctypePublicIdentifier),this.currentToken.forceQuirks=!0,this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(o.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(o.missingQuoteBeforeDoctypePublicIdentifier),this.currentToken.forceQuirks=!0,this._reconsumeInState(ek))}[ef](e){isWhitespace(e)||(e===s.QUOTATION_MARK?(this.currentToken.publicId="",this.state=em):e===s.APOSTROPHE?(this.currentToken.publicId="",this.state=eg):e===s.GREATER_THAN_SIGN?(this._err(o.missingDoctypePublicIdentifier),this.currentToken.forceQuirks=!0,this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(o.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(o.missingQuoteBeforeDoctypePublicIdentifier),this.currentToken.forceQuirks=!0,this._reconsumeInState(ek)))}[em](e){e===s.QUOTATION_MARK?this.state=eE:e===s.NULL?(this._err(o.unexpectedNullCharacter),this.currentToken.publicId+=i.REPLACEMENT_CHARACTER):e===s.GREATER_THAN_SIGN?(this._err(o.abruptDoctypePublicIdentifier),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this.state=u):e===s.EOF?(this._err(o.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):this.currentToken.publicId+=toChar(e)}[eg](e){e===s.APOSTROPHE?this.state=eE:e===s.NULL?(this._err(o.unexpectedNullCharacter),this.currentToken.publicId+=i.REPLACEMENT_CHARACTER):e===s.GREATER_THAN_SIGN?(this._err(o.abruptDoctypePublicIdentifier),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this.state=u):e===s.EOF?(this._err(o.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):this.currentToken.publicId+=toChar(e)}[eE](e){isWhitespace(e)?this.state=eb:e===s.GREATER_THAN_SIGN?(this.state=u,this._emitCurrentToken()):e===s.QUOTATION_MARK?(this._err(o.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers),this.currentToken.systemId="",this.state=eA):e===s.APOSTROPHE?(this._err(o.missingWhitespaceBetweenDoctypePublicAndSystemIdentifiers),this.currentToken.systemId="",this.state=eC):e===s.EOF?(this._err(o.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(o.missingQuoteBeforeDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this._reconsumeInState(ek))}[eb](e){isWhitespace(e)||(e===s.GREATER_THAN_SIGN?(this._emitCurrentToken(),this.state=u):e===s.QUOTATION_MARK?(this.currentToken.systemId="",this.state=eA):e===s.APOSTROPHE?(this.currentToken.systemId="",this.state=eC):e===s.EOF?(this._err(o.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(o.missingQuoteBeforeDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this._reconsumeInState(ek)))}[eT](e){isWhitespace(e)?this.state=e_:e===s.QUOTATION_MARK?(this._err(o.missingWhitespaceAfterDoctypeSystemKeyword),this.currentToken.systemId="",this.state=eA):e===s.APOSTROPHE?(this._err(o.missingWhitespaceAfterDoctypeSystemKeyword),this.currentToken.systemId="",this.state=eC):e===s.GREATER_THAN_SIGN?(this._err(o.missingDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(o.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(o.missingQuoteBeforeDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this._reconsumeInState(ek))}[e_](e){isWhitespace(e)||(e===s.QUOTATION_MARK?(this.currentToken.systemId="",this.state=eA):e===s.APOSTROPHE?(this.currentToken.systemId="",this.state=eC):e===s.GREATER_THAN_SIGN?(this._err(o.missingDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this.state=u,this._emitCurrentToken()):e===s.EOF?(this._err(o.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(o.missingQuoteBeforeDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this._reconsumeInState(ek)))}[eA](e){e===s.QUOTATION_MARK?this.state=ey:e===s.NULL?(this._err(o.unexpectedNullCharacter),this.currentToken.systemId+=i.REPLACEMENT_CHARACTER):e===s.GREATER_THAN_SIGN?(this._err(o.abruptDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this.state=u):e===s.EOF?(this._err(o.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):this.currentToken.systemId+=toChar(e)}[eC](e){e===s.APOSTROPHE?this.state=ey:e===s.NULL?(this._err(o.unexpectedNullCharacter),this.currentToken.systemId+=i.REPLACEMENT_CHARACTER):e===s.GREATER_THAN_SIGN?(this._err(o.abruptDoctypeSystemIdentifier),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this.state=u):e===s.EOF?(this._err(o.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):this.currentToken.systemId+=toChar(e)}[ey](e){isWhitespace(e)||(e===s.GREATER_THAN_SIGN?(this._emitCurrentToken(),this.state=u):e===s.EOF?(this._err(o.eofInDoctype),this.currentToken.forceQuirks=!0,this._emitCurrentToken(),this._emitEOFToken()):(this._err(o.unexpectedCharacterAfterDoctypeSystemIdentifier),this._reconsumeInState(ek)))}[ek](e){e===s.GREATER_THAN_SIGN?(this._emitCurrentToken(),this.state=u):e===s.NULL?this._err(o.unexpectedNullCharacter):e===s.EOF&&(this._emitCurrentToken(),this._emitEOFToken())}[eN](e){e===s.RIGHT_SQUARE_BRACKET?this.state=eS:e===s.EOF?(this._err(o.eofInCdata),this._emitEOFToken()):this._emitCodePoint(e)}[eS](e){e===s.RIGHT_SQUARE_BRACKET?this.state=eD:(this._emitChars("]"),this._reconsumeInState(eN))}[eD](e){e===s.GREATER_THAN_SIGN?this.state=u:e===s.RIGHT_SQUARE_BRACKET?this._emitChars("]"):(this._emitChars("]]"),this._reconsumeInState(eN))}[ex](e){this.tempBuff=[s.AMPERSAND],e===s.NUMBER_SIGN?(this.tempBuff.push(e),this.state=eI):isAsciiAlphaNumeric(e)?this._reconsumeInState(eO):(this._flushCodePointsConsumedAsCharacterReference(),this._reconsumeInState(this.returnState))}[eO](e){let t=this._matchNamedCharacterReference(e);if(this._ensureHibernation())this.tempBuff=[s.AMPERSAND];else if(t){let e=this.tempBuff[this.tempBuff.length-1]===s.SEMICOLON;this._isCharacterReferenceAttributeQuirk(e)||(e||this._errOnNextCodePoint(o.missingSemicolonAfterCharacterReference),this.tempBuff=t),this._flushCodePointsConsumedAsCharacterReference(),this.state=this.returnState}else this._flushCodePointsConsumedAsCharacterReference(),this.state=ev}[ev](e){isAsciiAlphaNumeric(e)?this._isCharacterReferenceInAttribute()?this.currentAttr.value+=toChar(e):this._emitCodePoint(e):(e===s.SEMICOLON&&this._err(o.unknownNamedCharacterReference),this._reconsumeInState(this.returnState))}[eI](e){this.charRefCode=0,e===s.LATIN_SMALL_X||e===s.LATIN_CAPITAL_X?(this.tempBuff.push(e),this.state=ew):this._reconsumeInState(eR)}[ew](e){isAsciiDigit(e)||isAsciiUpperHexDigit(e)||isAsciiLowerHexDigit(e)?this._reconsumeInState(eF):(this._err(o.absenceOfDigitsInNumericCharacterReference),this._flushCodePointsConsumedAsCharacterReference(),this._reconsumeInState(this.returnState))}[eR](e){isAsciiDigit(e)?this._reconsumeInState(eM):(this._err(o.absenceOfDigitsInNumericCharacterReference),this._flushCodePointsConsumedAsCharacterReference(),this._reconsumeInState(this.returnState))}[eF](e){isAsciiUpperHexDigit(e)?this.charRefCode=16*this.charRefCode+e-55:isAsciiLowerHexDigit(e)?this.charRefCode=16*this.charRefCode+e-87:isAsciiDigit(e)?this.charRefCode=16*this.charRefCode+e-48:e===s.SEMICOLON?this.state=eL:(this._err(o.missingSemicolonAfterCharacterReference),this._reconsumeInState(eL))}[eM](e){isAsciiDigit(e)?this.charRefCode=10*this.charRefCode+e-48:e===s.SEMICOLON?this.state=eL:(this._err(o.missingSemicolonAfterCharacterReference),this._reconsumeInState(eL))}[eL](){if(this.charRefCode===s.NULL)this._err(o.nullCharacterReference),this.charRefCode=s.REPLACEMENT_CHARACTER;else if(this.charRefCode>1114111)this._err(o.characterReferenceOutsideUnicodeRange),this.charRefCode=s.REPLACEMENT_CHARACTER;else if(i.isSurrogate(this.charRefCode))this._err(o.surrogateCharacterReference),this.charRefCode=s.REPLACEMENT_CHARACTER;else if(i.isUndefinedCodePoint(this.charRefCode))this._err(o.noncharacterCharacterReference);else if(i.isControlCodePoint(this.charRefCode)||this.charRefCode===s.CARRIAGE_RETURN){this._err(o.controlCharacterReference);let e=c[this.charRefCode];e&&(this.charRefCode=e)}this.tempBuff=[this.charRefCode],this._flushCodePointsConsumedAsCharacterReference(),this._reconsumeInState(this.returnState)}};Tokenizer.CHARACTER_TOKEN="CHARACTER_TOKEN",Tokenizer.NULL_CHARACTER_TOKEN="NULL_CHARACTER_TOKEN",Tokenizer.WHITESPACE_CHARACTER_TOKEN="WHITESPACE_CHARACTER_TOKEN",Tokenizer.START_TAG_TOKEN="START_TAG_TOKEN",Tokenizer.END_TAG_TOKEN="END_TAG_TOKEN",Tokenizer.COMMENT_TOKEN="COMMENT_TOKEN",Tokenizer.DOCTYPE_TOKEN="DOCTYPE_TOKEN",Tokenizer.EOF_TOKEN="EOF_TOKEN",Tokenizer.HIBERNATION_TOKEN="HIBERNATION_TOKEN",Tokenizer.MODE={DATA:u,RCDATA:d,RAWTEXT:p,SCRIPT_DATA:f,PLAINTEXT:m},Tokenizer.getTokenAttr=function(e,t){for(let n=e.attrs.length-1;n>=0;n--)if(e.attrs[n].name===t)return e.attrs[n].value;return null},e.exports=Tokenizer},5482:function(e){"use strict";e.exports=new Uint16Array([4,52,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,106,303,412,810,1432,1701,1796,1987,2114,2360,2420,2484,3170,3251,4140,4393,4575,4610,5106,5512,5728,6117,6274,6315,6345,6427,6516,7002,7910,8733,9323,9870,10170,10631,10893,11318,11386,11467,12773,13092,14474,14922,15448,15542,16419,17666,18166,18611,19004,19095,19298,19397,4,16,69,77,97,98,99,102,103,108,109,110,111,112,114,115,116,117,140,150,158,169,176,194,199,210,216,222,226,242,256,266,283,294,108,105,103,5,198,1,59,148,1,198,80,5,38,1,59,156,1,38,99,117,116,101,5,193,1,59,167,1,193,114,101,118,101,59,1,258,4,2,105,121,182,191,114,99,5,194,1,59,189,1,194,59,1,1040,114,59,3,55349,56580,114,97,118,101,5,192,1,59,208,1,192,112,104,97,59,1,913,97,99,114,59,1,256,100,59,1,10835,4,2,103,112,232,237,111,110,59,1,260,102,59,3,55349,56632,112,108,121,70,117,110,99,116,105,111,110,59,1,8289,105,110,103,5,197,1,59,264,1,197,4,2,99,115,272,277,114,59,3,55349,56476,105,103,110,59,1,8788,105,108,100,101,5,195,1,59,292,1,195,109,108,5,196,1,59,301,1,196,4,8,97,99,101,102,111,114,115,117,321,350,354,383,388,394,400,405,4,2,99,114,327,336,107,115,108,97,115,104,59,1,8726,4,2,118,119,342,345,59,1,10983,101,100,59,1,8966,121,59,1,1041,4,3,99,114,116,362,369,379,97,117,115,101,59,1,8757,110,111,117,108,108,105,115,59,1,8492,97,59,1,914,114,59,3,55349,56581,112,102,59,3,55349,56633,101,118,101,59,1,728,99,114,59,1,8492,109,112,101,113,59,1,8782,4,14,72,79,97,99,100,101,102,104,105,108,111,114,115,117,442,447,456,504,542,547,569,573,577,616,678,784,790,796,99,121,59,1,1063,80,89,5,169,1,59,454,1,169,4,3,99,112,121,464,470,497,117,116,101,59,1,262,4,2,59,105,476,478,1,8914,116,97,108,68,105,102,102,101,114,101,110,116,105,97,108,68,59,1,8517,108,101,121,115,59,1,8493,4,4,97,101,105,111,514,520,530,535,114,111,110,59,1,268,100,105,108,5,199,1,59,528,1,199,114,99,59,1,264,110,105,110,116,59,1,8752,111,116,59,1,266,4,2,100,110,553,560,105,108,108,97,59,1,184,116,101,114,68,111,116,59,1,183,114,59,1,8493,105,59,1,935,114,99,108,101,4,4,68,77,80,84,591,596,603,609,111,116,59,1,8857,105,110,117,115,59,1,8854,108,117,115,59,1,8853,105,109,101,115,59,1,8855,111,4,2,99,115,623,646,107,119,105,115,101,67,111,110,116,111,117,114,73,110,116,101,103,114,97,108,59,1,8754,101,67,117,114,108,121,4,2,68,81,658,671,111,117,98,108,101,81,117,111,116,101,59,1,8221,117,111,116,101,59,1,8217,4,4,108,110,112,117,688,701,736,753,111,110,4,2,59,101,696,698,1,8759,59,1,10868,4,3,103,105,116,709,717,722,114,117,101,110,116,59,1,8801,110,116,59,1,8751,111,117,114,73,110,116,101,103,114,97,108,59,1,8750,4,2,102,114,742,745,59,1,8450,111,100,117,99,116,59,1,8720,110,116,101,114,67,108,111,99,107,119,105,115,101,67,111,110,116,111,117,114,73,110,116,101,103,114,97,108,59,1,8755,111,115,115,59,1,10799,99,114,59,3,55349,56478,112,4,2,59,67,803,805,1,8915,97,112,59,1,8781,4,11,68,74,83,90,97,99,101,102,105,111,115,834,850,855,860,865,888,903,916,921,1011,1415,4,2,59,111,840,842,1,8517,116,114,97,104,100,59,1,10513,99,121,59,1,1026,99,121,59,1,1029,99,121,59,1,1039,4,3,103,114,115,873,879,883,103,101,114,59,1,8225,114,59,1,8609,104,118,59,1,10980,4,2,97,121,894,900,114,111,110,59,1,270,59,1,1044,108,4,2,59,116,910,912,1,8711,97,59,1,916,114,59,3,55349,56583,4,2,97,102,927,998,4,2,99,109,933,992,114,105,116,105,99,97,108,4,4,65,68,71,84,950,957,978,985,99,117,116,101,59,1,180,111,4,2,116,117,964,967,59,1,729,98,108,101,65,99,117,116,101,59,1,733,114,97,118,101,59,1,96,105,108,100,101,59,1,732,111,110,100,59,1,8900,102,101,114,101,110,116,105,97,108,68,59,1,8518,4,4,112,116,117,119,1021,1026,1048,1249,102,59,3,55349,56635,4,3,59,68,69,1034,1036,1041,1,168,111,116,59,1,8412,113,117,97,108,59,1,8784,98,108,101,4,6,67,68,76,82,85,86,1065,1082,1101,1189,1211,1236,111,110,116,111,117,114,73,110,116,101,103,114,97,108,59,1,8751,111,4,2,116,119,1089,1092,59,1,168,110,65,114,114,111,119,59,1,8659,4,2,101,111,1107,1141,102,116,4,3,65,82,84,1117,1124,1136,114,114,111,119,59,1,8656,105,103,104,116,65,114,114,111,119,59,1,8660,101,101,59,1,10980,110,103,4,2,76,82,1149,1177,101,102,116,4,2,65,82,1158,1165,114,114,111,119,59,1,10232,105,103,104,116,65,114,114,111,119,59,1,10234,105,103,104,116,65,114,114,111,119,59,1,10233,105,103,104,116,4,2,65,84,1199,1206,114,114,111,119,59,1,8658,101,101,59,1,8872,112,4,2,65,68,1218,1225,114,114,111,119,59,1,8657,111,119,110,65,114,114,111,119,59,1,8661,101,114,116,105,99,97,108,66,97,114,59,1,8741,110,4,6,65,66,76,82,84,97,1264,1292,1299,1352,1391,1408,114,114,111,119,4,3,59,66,85,1276,1278,1283,1,8595,97,114,59,1,10515,112,65,114,114,111,119,59,1,8693,114,101,118,101,59,1,785,101,102,116,4,3,82,84,86,1310,1323,1334,105,103,104,116,86,101,99,116,111,114,59,1,10576,101,101,86,101,99,116,111,114,59,1,10590,101,99,116,111,114,4,2,59,66,1345,1347,1,8637,97,114,59,1,10582,105,103,104,116,4,2,84,86,1362,1373,101,101,86,101,99,116,111,114,59,1,10591,101,99,116,111,114,4,2,59,66,1384,1386,1,8641,97,114,59,1,10583,101,101,4,2,59,65,1399,1401,1,8868,114,114,111,119,59,1,8615,114,114,111,119,59,1,8659,4,2,99,116,1421,1426,114,59,3,55349,56479,114,111,107,59,1,272,4,16,78,84,97,99,100,102,103,108,109,111,112,113,115,116,117,120,1466,1470,1478,1489,1515,1520,1525,1536,1544,1593,1609,1617,1650,1664,1668,1677,71,59,1,330,72,5,208,1,59,1476,1,208,99,117,116,101,5,201,1,59,1487,1,201,4,3,97,105,121,1497,1503,1512,114,111,110,59,1,282,114,99,5,202,1,59,1510,1,202,59,1,1069,111,116,59,1,278,114,59,3,55349,56584,114,97,118,101,5,200,1,59,1534,1,200,101,109,101,110,116,59,1,8712,4,2,97,112,1550,1555,99,114,59,1,274,116,121,4,2,83,86,1563,1576,109,97,108,108,83,113,117,97,114,101,59,1,9723,101,114,121,83,109,97,108,108,83,113,117,97,114,101,59,1,9643,4,2,103,112,1599,1604,111,110,59,1,280,102,59,3,55349,56636,115,105,108,111,110,59,1,917,117,4,2,97,105,1624,1640,108,4,2,59,84,1631,1633,1,10869,105,108,100,101,59,1,8770,108,105,98,114,105,117,109,59,1,8652,4,2,99,105,1656,1660,114,59,1,8496,109,59,1,10867,97,59,1,919,109,108,5,203,1,59,1675,1,203,4,2,105,112,1683,1689,115,116,115,59,1,8707,111,110,101,110,116,105,97,108,69,59,1,8519,4,5,99,102,105,111,115,1713,1717,1722,1762,1791,121,59,1,1060,114,59,3,55349,56585,108,108,101,100,4,2,83,86,1732,1745,109,97,108,108,83,113,117,97,114,101,59,1,9724,101,114,121,83,109,97,108,108,83,113,117,97,114,101,59,1,9642,4,3,112,114,117,1770,1775,1781,102,59,3,55349,56637,65,108,108,59,1,8704,114,105,101,114,116,114,102,59,1,8497,99,114,59,1,8497,4,12,74,84,97,98,99,100,102,103,111,114,115,116,1822,1827,1834,1848,1855,1877,1882,1887,1890,1896,1978,1984,99,121,59,1,1027,5,62,1,59,1832,1,62,109,109,97,4,2,59,100,1843,1845,1,915,59,1,988,114,101,118,101,59,1,286,4,3,101,105,121,1863,1869,1874,100,105,108,59,1,290,114,99,59,1,284,59,1,1043,111,116,59,1,288,114,59,3,55349,56586,59,1,8921,112,102,59,3,55349,56638,101,97,116,101,114,4,6,69,70,71,76,83,84,1915,1933,1944,1953,1959,1971,113,117,97,108,4,2,59,76,1925,1927,1,8805,101,115,115,59,1,8923,117,108,108,69,113,117,97,108,59,1,8807,114,101,97,116,101,114,59,1,10914,101,115,115,59,1,8823,108,97,110,116,69,113,117,97,108,59,1,10878,105,108,100,101,59,1,8819,99,114,59,3,55349,56482,59,1,8811,4,8,65,97,99,102,105,111,115,117,2005,2012,2026,2032,2036,2049,2073,2089,82,68,99,121,59,1,1066,4,2,99,116,2018,2023,101,107,59,1,711,59,1,94,105,114,99,59,1,292,114,59,1,8460,108,98,101,114,116,83,112,97,99,101,59,1,8459,4,2,112,114,2055,2059,102,59,1,8461,105,122,111,110,116,97,108,76,105,110,101,59,1,9472,4,2,99,116,2079,2083,114,59,1,8459,114,111,107,59,1,294,109,112,4,2,68,69,2097,2107,111,119,110,72,117,109,112,59,1,8782,113,117,97,108,59,1,8783,4,14,69,74,79,97,99,100,102,103,109,110,111,115,116,117,2144,2149,2155,2160,2171,2189,2194,2198,2209,2245,2307,2329,2334,2341,99,121,59,1,1045,108,105,103,59,1,306,99,121,59,1,1025,99,117,116,101,5,205,1,59,2169,1,205,4,2,105,121,2177,2186,114,99,5,206,1,59,2184,1,206,59,1,1048,111,116,59,1,304,114,59,1,8465,114,97,118,101,5,204,1,59,2207,1,204,4,3,59,97,112,2217,2219,2238,1,8465,4,2,99,103,2225,2229,114,59,1,298,105,110,97,114,121,73,59,1,8520,108,105,101,115,59,1,8658,4,2,116,118,2251,2281,4,2,59,101,2257,2259,1,8748,4,2,103,114,2265,2271,114,97,108,59,1,8747,115,101,99,116,105,111,110,59,1,8898,105,115,105,98,108,101,4,2,67,84,2293,2300,111,109,109,97,59,1,8291,105,109,101,115,59,1,8290,4,3,103,112,116,2315,2320,2325,111,110,59,1,302,102,59,3,55349,56640,97,59,1,921,99,114,59,1,8464,105,108,100,101,59,1,296,4,2,107,109,2347,2352,99,121,59,1,1030,108,5,207,1,59,2358,1,207,4,5,99,102,111,115,117,2372,2386,2391,2397,2414,4,2,105,121,2378,2383,114,99,59,1,308,59,1,1049,114,59,3,55349,56589,112,102,59,3,55349,56641,4,2,99,101,2403,2408,114,59,3,55349,56485,114,99,121,59,1,1032,107,99,121,59,1,1028,4,7,72,74,97,99,102,111,115,2436,2441,2446,2452,2467,2472,2478,99,121,59,1,1061,99,121,59,1,1036,112,112,97,59,1,922,4,2,101,121,2458,2464,100,105,108,59,1,310,59,1,1050,114,59,3,55349,56590,112,102,59,3,55349,56642,99,114,59,3,55349,56486,4,11,74,84,97,99,101,102,108,109,111,115,116,2508,2513,2520,2562,2585,2981,2986,3004,3011,3146,3167,99,121,59,1,1033,5,60,1,59,2518,1,60,4,5,99,109,110,112,114,2532,2538,2544,2548,2558,117,116,101,59,1,313,98,100,97,59,1,923,103,59,1,10218,108,97,99,101,116,114,102,59,1,8466,114,59,1,8606,4,3,97,101,121,2570,2576,2582,114,111,110,59,1,317,100,105,108,59,1,315,59,1,1051,4,2,102,115,2591,2907,116,4,10,65,67,68,70,82,84,85,86,97,114,2614,2663,2672,2728,2735,2760,2820,2870,2888,2895,4,2,110,114,2620,2633,103,108,101,66,114,97,99,107,101,116,59,1,10216,114,111,119,4,3,59,66,82,2644,2646,2651,1,8592,97,114,59,1,8676,105,103,104,116,65,114,114,111,119,59,1,8646,101,105,108,105,110,103,59,1,8968,111,4,2,117,119,2679,2692,98,108,101,66,114,97,99,107,101,116,59,1,10214,110,4,2,84,86,2699,2710,101,101,86,101,99,116,111,114,59,1,10593,101,99,116,111,114,4,2,59,66,2721,2723,1,8643,97,114,59,1,10585,108,111,111,114,59,1,8970,105,103,104,116,4,2,65,86,2745,2752,114,114,111,119,59,1,8596,101,99,116,111,114,59,1,10574,4,2,101,114,2766,2792,101,4,3,59,65,86,2775,2777,2784,1,8867,114,114,111,119,59,1,8612,101,99,116,111,114,59,1,10586,105,97,110,103,108,101,4,3,59,66,69,2806,2808,2813,1,8882,97,114,59,1,10703,113,117,97,108,59,1,8884,112,4,3,68,84,86,2829,2841,2852,111,119,110,86,101,99,116,111,114,59,1,10577,101,101,86,101,99,116,111,114,59,1,10592,101,99,116,111,114,4,2,59,66,2863,2865,1,8639,97,114,59,1,10584,101,99,116,111,114,4,2,59,66,2881,2883,1,8636,97,114,59,1,10578,114,114,111,119,59,1,8656,105,103,104,116,97,114,114,111,119,59,1,8660,115,4,6,69,70,71,76,83,84,2922,2936,2947,2956,2962,2974,113,117,97,108,71,114,101,97,116,101,114,59,1,8922,117,108,108,69,113,117,97,108,59,1,8806,114,101,97,116,101,114,59,1,8822,101,115,115,59,1,10913,108,97,110,116,69,113,117,97,108,59,1,10877,105,108,100,101,59,1,8818,114,59,3,55349,56591,4,2,59,101,2992,2994,1,8920,102,116,97,114,114,111,119,59,1,8666,105,100,111,116,59,1,319,4,3,110,112,119,3019,3110,3115,103,4,4,76,82,108,114,3030,3058,3070,3098,101,102,116,4,2,65,82,3039,3046,114,114,111,119,59,1,10229,105,103,104,116,65,114,114,111,119,59,1,10231,105,103,104,116,65,114,114,111,119,59,1,10230,101,102,116,4,2,97,114,3079,3086,114,114,111,119,59,1,10232,105,103,104,116,97,114,114,111,119,59,1,10234,105,103,104,116,97,114,114,111,119,59,1,10233,102,59,3,55349,56643,101,114,4,2,76,82,3123,3134,101,102,116,65,114,114,111,119,59,1,8601,105,103,104,116,65,114,114,111,119,59,1,8600,4,3,99,104,116,3154,3158,3161,114,59,1,8466,59,1,8624,114,111,107,59,1,321,59,1,8810,4,8,97,99,101,102,105,111,115,117,3188,3192,3196,3222,3227,3237,3243,3248,112,59,1,10501,121,59,1,1052,4,2,100,108,3202,3213,105,117,109,83,112,97,99,101,59,1,8287,108,105,110,116,114,102,59,1,8499,114,59,3,55349,56592,110,117,115,80,108,117,115,59,1,8723,112,102,59,3,55349,56644,99,114,59,1,8499,59,1,924,4,9,74,97,99,101,102,111,115,116,117,3271,3276,3283,3306,3422,3427,4120,4126,4137,99,121,59,1,1034,99,117,116,101,59,1,323,4,3,97,101,121,3291,3297,3303,114,111,110,59,1,327,100,105,108,59,1,325,59,1,1053,4,3,103,115,119,3314,3380,3415,97,116,105,118,101,4,3,77,84,86,3327,3340,3365,101,100,105,117,109,83,112,97,99,101,59,1,8203,104,105,4,2,99,110,3348,3357,107,83,112,97,99,101,59,1,8203,83,112,97,99,101,59,1,8203,101,114,121,84,104,105,110,83,112,97,99,101,59,1,8203,116,101,100,4,2,71,76,3389,3405,114,101,97,116,101,114,71,114,101,97,116,101,114,59,1,8811,101,115,115,76,101,115,115,59,1,8810,76,105,110,101,59,1,10,114,59,3,55349,56593,4,4,66,110,112,116,3437,3444,3460,3464,114,101,97,107,59,1,8288,66,114,101,97,107,105,110,103,83,112,97,99,101,59,1,160,102,59,1,8469,4,13,59,67,68,69,71,72,76,78,80,82,83,84,86,3492,3494,3517,3536,3578,3657,3685,3784,3823,3860,3915,4066,4107,1,10988,4,2,111,117,3500,3510,110,103,114,117,101,110,116,59,1,8802,112,67,97,112,59,1,8813,111,117,98,108,101,86,101,114,116,105,99,97,108,66,97,114,59,1,8742,4,3,108,113,120,3544,3552,3571,101,109,101,110,116,59,1,8713,117,97,108,4,2,59,84,3561,3563,1,8800,105,108,100,101,59,3,8770,824,105,115,116,115,59,1,8708,114,101,97,116,101,114,4,7,59,69,70,71,76,83,84,3600,3602,3609,3621,3631,3637,3650,1,8815,113,117,97,108,59,1,8817,117,108,108,69,113,117,97,108,59,3,8807,824,114,101,97,116,101,114,59,3,8811,824,101,115,115,59,1,8825,108,97,110,116,69,113,117,97,108,59,3,10878,824,105,108,100,101,59,1,8821,117,109,112,4,2,68,69,3666,3677,111,119,110,72,117,109,112,59,3,8782,824,113,117,97,108,59,3,8783,824,101,4,2,102,115,3692,3724,116,84,114,105,97,110,103,108,101,4,3,59,66,69,3709,3711,3717,1,8938,97,114,59,3,10703,824,113,117,97,108,59,1,8940,115,4,6,59,69,71,76,83,84,3739,3741,3748,3757,3764,3777,1,8814,113,117,97,108,59,1,8816,114,101,97,116,101,114,59,1,8824,101,115,115,59,3,8810,824,108,97,110,116,69,113,117,97,108,59,3,10877,824,105,108,100,101,59,1,8820,101,115,116,101,100,4,2,71,76,3795,3812,114,101,97,116,101,114,71,114,101,97,116,101,114,59,3,10914,824,101,115,115,76,101,115,115,59,3,10913,824,114,101,99,101,100,101,115,4,3,59,69,83,3838,3840,3848,1,8832,113,117,97,108,59,3,10927,824,108,97,110,116,69,113,117,97,108,59,1,8928,4,2,101,105,3866,3881,118,101,114,115,101,69,108,101,109,101,110,116,59,1,8716,103,104,116,84,114,105,97,110,103,108,101,4,3,59,66,69,3900,3902,3908,1,8939,97,114,59,3,10704,824,113,117,97,108,59,1,8941,4,2,113,117,3921,3973,117,97,114,101,83,117,4,2,98,112,3933,3952,115,101,116,4,2,59,69,3942,3945,3,8847,824,113,117,97,108,59,1,8930,101,114,115,101,116,4,2,59,69,3963,3966,3,8848,824,113,117,97,108,59,1,8931,4,3,98,99,112,3981,4e3,4045,115,101,116,4,2,59,69,3990,3993,3,8834,8402,113,117,97,108,59,1,8840,99,101,101,100,115,4,4,59,69,83,84,4015,4017,4025,4037,1,8833,113,117,97,108,59,3,10928,824,108,97,110,116,69,113,117,97,108,59,1,8929,105,108,100,101,59,3,8831,824,101,114,115,101,116,4,2,59,69,4056,4059,3,8835,8402,113,117,97,108,59,1,8841,105,108,100,101,4,4,59,69,70,84,4080,4082,4089,4100,1,8769,113,117,97,108,59,1,8772,117,108,108,69,113,117,97,108,59,1,8775,105,108,100,101,59,1,8777,101,114,116,105,99,97,108,66,97,114,59,1,8740,99,114,59,3,55349,56489,105,108,100,101,5,209,1,59,4135,1,209,59,1,925,4,14,69,97,99,100,102,103,109,111,112,114,115,116,117,118,4170,4176,4187,4205,4212,4217,4228,4253,4259,4292,4295,4316,4337,4346,108,105,103,59,1,338,99,117,116,101,5,211,1,59,4185,1,211,4,2,105,121,4193,4202,114,99,5,212,1,59,4200,1,212,59,1,1054,98,108,97,99,59,1,336,114,59,3,55349,56594,114,97,118,101,5,210,1,59,4226,1,210,4,3,97,101,105,4236,4241,4246,99,114,59,1,332,103,97,59,1,937,99,114,111,110,59,1,927,112,102,59,3,55349,56646,101,110,67,117,114,108,121,4,2,68,81,4272,4285,111,117,98,108,101,81,117,111,116,101,59,1,8220,117,111,116,101,59,1,8216,59,1,10836,4,2,99,108,4301,4306,114,59,3,55349,56490,97,115,104,5,216,1,59,4314,1,216,105,4,2,108,109,4323,4332,100,101,5,213,1,59,4330,1,213,101,115,59,1,10807,109,108,5,214,1,59,4344,1,214,101,114,4,2,66,80,4354,4380,4,2,97,114,4360,4364,114,59,1,8254,97,99,4,2,101,107,4372,4375,59,1,9182,101,116,59,1,9140,97,114,101,110,116,104,101,115,105,115,59,1,9180,4,9,97,99,102,104,105,108,111,114,115,4413,4422,4426,4431,4435,4438,4448,4471,4561,114,116,105,97,108,68,59,1,8706,121,59,1,1055,114,59,3,55349,56595,105,59,1,934,59,1,928,117,115,77,105,110,117,115,59,1,177,4,2,105,112,4454,4467,110,99,97,114,101,112,108,97,110,101,59,1,8460,102,59,1,8473,4,4,59,101,105,111,4481,4483,4526,4531,1,10939,99,101,100,101,115,4,4,59,69,83,84,4498,4500,4507,4519,1,8826,113,117,97,108,59,1,10927,108,97,110,116,69,113,117,97,108,59,1,8828,105,108,100,101,59,1,8830,109,101,59,1,8243,4,2,100,112,4537,4543,117,99,116,59,1,8719,111,114,116,105,111,110,4,2,59,97,4555,4557,1,8759,108,59,1,8733,4,2,99,105,4567,4572,114,59,3,55349,56491,59,1,936,4,4,85,102,111,115,4585,4594,4599,4604,79,84,5,34,1,59,4592,1,34,114,59,3,55349,56596,112,102,59,1,8474,99,114,59,3,55349,56492,4,12,66,69,97,99,101,102,104,105,111,114,115,117,4636,4642,4650,4681,4704,4763,4767,4771,5047,5069,5081,5094,97,114,114,59,1,10512,71,5,174,1,59,4648,1,174,4,3,99,110,114,4658,4664,4668,117,116,101,59,1,340,103,59,1,10219,114,4,2,59,116,4675,4677,1,8608,108,59,1,10518,4,3,97,101,121,4689,4695,4701,114,111,110,59,1,344,100,105,108,59,1,342,59,1,1056,4,2,59,118,4710,4712,1,8476,101,114,115,101,4,2,69,85,4722,4748,4,2,108,113,4728,4736,101,109,101,110,116,59,1,8715,117,105,108,105,98,114,105,117,109,59,1,8651,112,69,113,117,105,108,105,98,114,105,117,109,59,1,10607,114,59,1,8476,111,59,1,929,103,104,116,4,8,65,67,68,70,84,85,86,97,4792,4840,4849,4905,4912,4972,5022,5040,4,2,110,114,4798,4811,103,108,101,66,114,97,99,107,101,116,59,1,10217,114,111,119,4,3,59,66,76,4822,4824,4829,1,8594,97,114,59,1,8677,101,102,116,65,114,114,111,119,59,1,8644,101,105,108,105,110,103,59,1,8969,111,4,2,117,119,4856,4869,98,108,101,66,114,97,99,107,101,116,59,1,10215,110,4,2,84,86,4876,4887,101,101,86,101,99,116,111,114,59,1,10589,101,99,116,111,114,4,2,59,66,4898,4900,1,8642,97,114,59,1,10581,108,111,111,114,59,1,8971,4,2,101,114,4918,4944,101,4,3,59,65,86,4927,4929,4936,1,8866,114,114,111,119,59,1,8614,101,99,116,111,114,59,1,10587,105,97,110,103,108,101,4,3,59,66,69,4958,4960,4965,1,8883,97,114,59,1,10704,113,117,97,108,59,1,8885,112,4,3,68,84,86,4981,4993,5004,111,119,110,86,101,99,116,111,114,59,1,10575,101,101,86,101,99,116,111,114,59,1,10588,101,99,116,111,114,4,2,59,66,5015,5017,1,8638,97,114,59,1,10580,101,99,116,111,114,4,2,59,66,5033,5035,1,8640,97,114,59,1,10579,114,114,111,119,59,1,8658,4,2,112,117,5053,5057,102,59,1,8477,110,100,73,109,112,108,105,101,115,59,1,10608,105,103,104,116,97,114,114,111,119,59,1,8667,4,2,99,104,5087,5091,114,59,1,8475,59,1,8625,108,101,68,101,108,97,121,101,100,59,1,10740,4,13,72,79,97,99,102,104,105,109,111,113,115,116,117,5134,5150,5157,5164,5198,5203,5259,5265,5277,5283,5374,5380,5385,4,2,67,99,5140,5146,72,99,121,59,1,1065,121,59,1,1064,70,84,99,121,59,1,1068,99,117,116,101,59,1,346,4,5,59,97,101,105,121,5176,5178,5184,5190,5195,1,10940,114,111,110,59,1,352,100,105,108,59,1,350,114,99,59,1,348,59,1,1057,114,59,3,55349,56598,111,114,116,4,4,68,76,82,85,5216,5227,5238,5250,111,119,110,65,114,114,111,119,59,1,8595,101,102,116,65,114,114,111,119,59,1,8592,105,103,104,116,65,114,114,111,119,59,1,8594,112,65,114,114,111,119,59,1,8593,103,109,97,59,1,931,97,108,108,67,105,114,99,108,101,59,1,8728,112,102,59,3,55349,56650,4,2,114,117,5289,5293,116,59,1,8730,97,114,101,4,4,59,73,83,85,5306,5308,5322,5367,1,9633,110,116,101,114,115,101,99,116,105,111,110,59,1,8851,117,4,2,98,112,5329,5347,115,101,116,4,2,59,69,5338,5340,1,8847,113,117,97,108,59,1,8849,101,114,115,101,116,4,2,59,69,5358,5360,1,8848,113,117,97,108,59,1,8850,110,105,111,110,59,1,8852,99,114,59,3,55349,56494,97,114,59,1,8902,4,4,98,99,109,112,5395,5420,5475,5478,4,2,59,115,5401,5403,1,8912,101,116,4,2,59,69,5411,5413,1,8912,113,117,97,108,59,1,8838,4,2,99,104,5426,5468,101,101,100,115,4,4,59,69,83,84,5440,5442,5449,5461,1,8827,113,117,97,108,59,1,10928,108,97,110,116,69,113,117,97,108,59,1,8829,105,108,100,101,59,1,8831,84,104,97,116,59,1,8715,59,1,8721,4,3,59,101,115,5486,5488,5507,1,8913,114,115,101,116,4,2,59,69,5498,5500,1,8835,113,117,97,108,59,1,8839,101,116,59,1,8913,4,11,72,82,83,97,99,102,104,105,111,114,115,5536,5546,5552,5567,5579,5602,5607,5655,5695,5701,5711,79,82,78,5,222,1,59,5544,1,222,65,68,69,59,1,8482,4,2,72,99,5558,5563,99,121,59,1,1035,121,59,1,1062,4,2,98,117,5573,5576,59,1,9,59,1,932,4,3,97,101,121,5587,5593,5599,114,111,110,59,1,356,100,105,108,59,1,354,59,1,1058,114,59,3,55349,56599,4,2,101,105,5613,5631,4,2,114,116,5619,5627,101,102,111,114,101,59,1,8756,97,59,1,920,4,2,99,110,5637,5647,107,83,112,97,99,101,59,3,8287,8202,83,112,97,99,101,59,1,8201,108,100,101,4,4,59,69,70,84,5668,5670,5677,5688,1,8764,113,117,97,108,59,1,8771,117,108,108,69,113,117,97,108,59,1,8773,105,108,100,101,59,1,8776,112,102,59,3,55349,56651,105,112,108,101,68,111,116,59,1,8411,4,2,99,116,5717,5722,114,59,3,55349,56495,114,111,107,59,1,358,4,14,97,98,99,100,102,103,109,110,111,112,114,115,116,117,5758,5789,5805,5823,5830,5835,5846,5852,5921,5937,6089,6095,6101,6108,4,2,99,114,5764,5774,117,116,101,5,218,1,59,5772,1,218,114,4,2,59,111,5781,5783,1,8607,99,105,114,59,1,10569,114,4,2,99,101,5796,5800,121,59,1,1038,118,101,59,1,364,4,2,105,121,5811,5820,114,99,5,219,1,59,5818,1,219,59,1,1059,98,108,97,99,59,1,368,114,59,3,55349,56600,114,97,118,101,5,217,1,59,5844,1,217,97,99,114,59,1,362,4,2,100,105,5858,5905,101,114,4,2,66,80,5866,5892,4,2,97,114,5872,5876,114,59,1,95,97,99,4,2,101,107,5884,5887,59,1,9183,101,116,59,1,9141,97,114,101,110,116,104,101,115,105,115,59,1,9181,111,110,4,2,59,80,5913,5915,1,8899,108,117,115,59,1,8846,4,2,103,112,5927,5932,111,110,59,1,370,102,59,3,55349,56652,4,8,65,68,69,84,97,100,112,115,5955,5985,5996,6009,6026,6033,6044,6075,114,114,111,119,4,3,59,66,68,5967,5969,5974,1,8593,97,114,59,1,10514,111,119,110,65,114,114,111,119,59,1,8645,111,119,110,65,114,114,111,119,59,1,8597,113,117,105,108,105,98,114,105,117,109,59,1,10606,101,101,4,2,59,65,6017,6019,1,8869,114,114,111,119,59,1,8613,114,114,111,119,59,1,8657,111,119,110,97,114,114,111,119,59,1,8661,101,114,4,2,76,82,6052,6063,101,102,116,65,114,114,111,119,59,1,8598,105,103,104,116,65,114,114,111,119,59,1,8599,105,4,2,59,108,6082,6084,1,978,111,110,59,1,933,105,110,103,59,1,366,99,114,59,3,55349,56496,105,108,100,101,59,1,360,109,108,5,220,1,59,6115,1,220,4,9,68,98,99,100,101,102,111,115,118,6137,6143,6148,6152,6166,6250,6255,6261,6267,97,115,104,59,1,8875,97,114,59,1,10987,121,59,1,1042,97,115,104,4,2,59,108,6161,6163,1,8873,59,1,10982,4,2,101,114,6172,6175,59,1,8897,4,3,98,116,121,6183,6188,6238,97,114,59,1,8214,4,2,59,105,6194,6196,1,8214,99,97,108,4,4,66,76,83,84,6209,6214,6220,6231,97,114,59,1,8739,105,110,101,59,1,124,101,112,97,114,97,116,111,114,59,1,10072,105,108,100,101,59,1,8768,84,104,105,110,83,112,97,99,101,59,1,8202,114,59,3,55349,56601,112,102,59,3,55349,56653,99,114,59,3,55349,56497,100,97,115,104,59,1,8874,4,5,99,101,102,111,115,6286,6292,6298,6303,6309,105,114,99,59,1,372,100,103,101,59,1,8896,114,59,3,55349,56602,112,102,59,3,55349,56654,99,114,59,3,55349,56498,4,4,102,105,111,115,6325,6330,6333,6339,114,59,3,55349,56603,59,1,926,112,102,59,3,55349,56655,99,114,59,3,55349,56499,4,9,65,73,85,97,99,102,111,115,117,6365,6370,6375,6380,6391,6405,6410,6416,6422,99,121,59,1,1071,99,121,59,1,1031,99,121,59,1,1070,99,117,116,101,5,221,1,59,6389,1,221,4,2,105,121,6397,6402,114,99,59,1,374,59,1,1067,114,59,3,55349,56604,112,102,59,3,55349,56656,99,114,59,3,55349,56500,109,108,59,1,376,4,8,72,97,99,100,101,102,111,115,6445,6450,6457,6472,6477,6501,6505,6510,99,121,59,1,1046,99,117,116,101,59,1,377,4,2,97,121,6463,6469,114,111,110,59,1,381,59,1,1047,111,116,59,1,379,4,2,114,116,6483,6497,111,87,105,100,116,104,83,112,97,99,101,59,1,8203,97,59,1,918,114,59,1,8488,112,102,59,1,8484,99,114,59,3,55349,56501,4,16,97,98,99,101,102,103,108,109,110,111,112,114,115,116,117,119,6550,6561,6568,6612,6622,6634,6645,6672,6699,6854,6870,6923,6933,6963,6974,6983,99,117,116,101,5,225,1,59,6559,1,225,114,101,118,101,59,1,259,4,6,59,69,100,105,117,121,6582,6584,6588,6591,6600,6609,1,8766,59,3,8766,819,59,1,8767,114,99,5,226,1,59,6598,1,226,116,101,5,180,1,59,6607,1,180,59,1,1072,108,105,103,5,230,1,59,6620,1,230,4,2,59,114,6628,6630,1,8289,59,3,55349,56606,114,97,118,101,5,224,1,59,6643,1,224,4,2,101,112,6651,6667,4,2,102,112,6657,6663,115,121,109,59,1,8501,104,59,1,8501,104,97,59,1,945,4,2,97,112,6678,6692,4,2,99,108,6684,6688,114,59,1,257,103,59,1,10815,5,38,1,59,6697,1,38,4,2,100,103,6705,6737,4,5,59,97,100,115,118,6717,6719,6724,6727,6734,1,8743,110,100,59,1,10837,59,1,10844,108,111,112,101,59,1,10840,59,1,10842,4,7,59,101,108,109,114,115,122,6753,6755,6758,6762,6814,6835,6848,1,8736,59,1,10660,101,59,1,8736,115,100,4,2,59,97,6770,6772,1,8737,4,8,97,98,99,100,101,102,103,104,6790,6793,6796,6799,6802,6805,6808,6811,59,1,10664,59,1,10665,59,1,10666,59,1,10667,59,1,10668,59,1,10669,59,1,10670,59,1,10671,116,4,2,59,118,6821,6823,1,8735,98,4,2,59,100,6830,6832,1,8894,59,1,10653,4,2,112,116,6841,6845,104,59,1,8738,59,1,197,97,114,114,59,1,9084,4,2,103,112,6860,6865,111,110,59,1,261,102,59,3,55349,56658,4,7,59,69,97,101,105,111,112,6886,6888,6891,6897,6900,6904,6908,1,8776,59,1,10864,99,105,114,59,1,10863,59,1,8778,100,59,1,8779,115,59,1,39,114,111,120,4,2,59,101,6917,6919,1,8776,113,59,1,8778,105,110,103,5,229,1,59,6931,1,229,4,3,99,116,121,6941,6946,6949,114,59,3,55349,56502,59,1,42,109,112,4,2,59,101,6957,6959,1,8776,113,59,1,8781,105,108,100,101,5,227,1,59,6972,1,227,109,108,5,228,1,59,6981,1,228,4,2,99,105,6989,6997,111,110,105,110,116,59,1,8755,110,116,59,1,10769,4,16,78,97,98,99,100,101,102,105,107,108,110,111,112,114,115,117,7036,7041,7119,7135,7149,7155,7219,7224,7347,7354,7463,7489,7786,7793,7814,7866,111,116,59,1,10989,4,2,99,114,7047,7094,107,4,4,99,101,112,115,7058,7064,7073,7080,111,110,103,59,1,8780,112,115,105,108,111,110,59,1,1014,114,105,109,101,59,1,8245,105,109,4,2,59,101,7088,7090,1,8765,113,59,1,8909,4,2,118,119,7100,7105,101,101,59,1,8893,101,100,4,2,59,103,7113,7115,1,8965,101,59,1,8965,114,107,4,2,59,116,7127,7129,1,9141,98,114,107,59,1,9142,4,2,111,121,7141,7146,110,103,59,1,8780,59,1,1073,113,117,111,59,1,8222,4,5,99,109,112,114,116,7167,7181,7188,7193,7199,97,117,115,4,2,59,101,7176,7178,1,8757,59,1,8757,112,116,121,118,59,1,10672,115,105,59,1,1014,110,111,117,59,1,8492,4,3,97,104,119,7207,7210,7213,59,1,946,59,1,8502,101,101,110,59,1,8812,114,59,3,55349,56607,103,4,7,99,111,115,116,117,118,119,7241,7262,7288,7305,7328,7335,7340,4,3,97,105,117,7249,7253,7258,112,59,1,8898,114,99,59,1,9711,112,59,1,8899,4,3,100,112,116,7270,7275,7281,111,116,59,1,10752,108,117,115,59,1,10753,105,109,101,115,59,1,10754,4,2,113,116,7294,7300,99,117,112,59,1,10758,97,114,59,1,9733,114,105,97,110,103,108,101,4,2,100,117,7318,7324,111,119,110,59,1,9661,112,59,1,9651,112,108,117,115,59,1,10756,101,101,59,1,8897,101,100,103,101,59,1,8896,97,114,111,119,59,1,10509,4,3,97,107,111,7362,7436,7458,4,2,99,110,7368,7432,107,4,3,108,115,116,7377,7386,7394,111,122,101,110,103,101,59,1,10731,113,117,97,114,101,59,1,9642,114,105,97,110,103,108,101,4,4,59,100,108,114,7411,7413,7419,7425,1,9652,111,119,110,59,1,9662,101,102,116,59,1,9666,105,103,104,116,59,1,9656,107,59,1,9251,4,2,49,51,7442,7454,4,2,50,52,7448,7451,59,1,9618,59,1,9617,52,59,1,9619,99,107,59,1,9608,4,2,101,111,7469,7485,4,2,59,113,7475,7478,3,61,8421,117,105,118,59,3,8801,8421,116,59,1,8976,4,4,112,116,119,120,7499,7504,7517,7523,102,59,3,55349,56659,4,2,59,116,7510,7512,1,8869,111,109,59,1,8869,116,105,101,59,1,8904,4,12,68,72,85,86,98,100,104,109,112,116,117,118,7549,7571,7597,7619,7655,7660,7682,7708,7715,7721,7728,7750,4,4,76,82,108,114,7559,7562,7565,7568,59,1,9559,59,1,9556,59,1,9558,59,1,9555,4,5,59,68,85,100,117,7583,7585,7588,7591,7594,1,9552,59,1,9574,59,1,9577,59,1,9572,59,1,9575,4,4,76,82,108,114,7607,7610,7613,7616,59,1,9565,59,1,9562,59,1,9564,59,1,9561,4,7,59,72,76,82,104,108,114,7635,7637,7640,7643,7646,7649,7652,1,9553,59,1,9580,59,1,9571,59,1,9568,59,1,9579,59,1,9570,59,1,9567,111,120,59,1,10697,4,4,76,82,108,114,7670,7673,7676,7679,59,1,9557,59,1,9554,59,1,9488,59,1,9484,4,5,59,68,85,100,117,7694,7696,7699,7702,7705,1,9472,59,1,9573,59,1,9576,59,1,9516,59,1,9524,105,110,117,115,59,1,8863,108,117,115,59,1,8862,105,109,101,115,59,1,8864,4,4,76,82,108,114,7738,7741,7744,7747,59,1,9563,59,1,9560,59,1,9496,59,1,9492,4,7,59,72,76,82,104,108,114,7766,7768,7771,7774,7777,7780,7783,1,9474,59,1,9578,59,1,9569,59,1,9566,59,1,9532,59,1,9508,59,1,9500,114,105,109,101,59,1,8245,4,2,101,118,7799,7804,118,101,59,1,728,98,97,114,5,166,1,59,7812,1,166,4,4,99,101,105,111,7824,7829,7834,7846,114,59,3,55349,56503,109,105,59,1,8271,109,4,2,59,101,7841,7843,1,8765,59,1,8909,108,4,3,59,98,104,7855,7857,7860,1,92,59,1,10693,115,117,98,59,1,10184,4,2,108,109,7872,7885,108,4,2,59,101,7879,7881,1,8226,116,59,1,8226,112,4,3,59,69,101,7894,7896,7899,1,8782,59,1,10926,4,2,59,113,7905,7907,1,8783,59,1,8783,4,15,97,99,100,101,102,104,105,108,111,114,115,116,117,119,121,7942,8021,8075,8080,8121,8126,8157,8279,8295,8430,8446,8485,8491,8707,8726,4,3,99,112,114,7950,7956,8007,117,116,101,59,1,263,4,6,59,97,98,99,100,115,7970,7972,7977,7984,7998,8003,1,8745,110,100,59,1,10820,114,99,117,112,59,1,10825,4,2,97,117,7990,7994,112,59,1,10827,112,59,1,10823,111,116,59,1,10816,59,3,8745,65024,4,2,101,111,8013,8017,116,59,1,8257,110,59,1,711,4,4,97,101,105,117,8031,8046,8056,8061,4,2,112,114,8037,8041,115,59,1,10829,111,110,59,1,269,100,105,108,5,231,1,59,8054,1,231,114,99,59,1,265,112,115,4,2,59,115,8069,8071,1,10828,109,59,1,10832,111,116,59,1,267,4,3,100,109,110,8088,8097,8104,105,108,5,184,1,59,8095,1,184,112,116,121,118,59,1,10674,116,5,162,2,59,101,8112,8114,1,162,114,100,111,116,59,1,183,114,59,3,55349,56608,4,3,99,101,105,8134,8138,8154,121,59,1,1095,99,107,4,2,59,109,8146,8148,1,10003,97,114,107,59,1,10003,59,1,967,114,4,7,59,69,99,101,102,109,115,8174,8176,8179,8258,8261,8268,8273,1,9675,59,1,10691,4,3,59,101,108,8187,8189,8193,1,710,113,59,1,8791,101,4,2,97,100,8200,8223,114,114,111,119,4,2,108,114,8210,8216,101,102,116,59,1,8634,105,103,104,116,59,1,8635,4,5,82,83,97,99,100,8235,8238,8241,8246,8252,59,1,174,59,1,9416,115,116,59,1,8859,105,114,99,59,1,8858,97,115,104,59,1,8861,59,1,8791,110,105,110,116,59,1,10768,105,100,59,1,10991,99,105,114,59,1,10690,117,98,115,4,2,59,117,8288,8290,1,9827,105,116,59,1,9827,4,4,108,109,110,112,8305,8326,8376,8400,111,110,4,2,59,101,8313,8315,1,58,4,2,59,113,8321,8323,1,8788,59,1,8788,4,2,109,112,8332,8344,97,4,2,59,116,8339,8341,1,44,59,1,64,4,3,59,102,108,8352,8354,8358,1,8705,110,59,1,8728,101,4,2,109,120,8365,8371,101,110,116,59,1,8705,101,115,59,1,8450,4,2,103,105,8382,8395,4,2,59,100,8388,8390,1,8773,111,116,59,1,10861,110,116,59,1,8750,4,3,102,114,121,8408,8412,8417,59,3,55349,56660,111,100,59,1,8720,5,169,2,59,115,8424,8426,1,169,114,59,1,8471,4,2,97,111,8436,8441,114,114,59,1,8629,115,115,59,1,10007,4,2,99,117,8452,8457,114,59,3,55349,56504,4,2,98,112,8463,8474,4,2,59,101,8469,8471,1,10959,59,1,10961,4,2,59,101,8480,8482,1,10960,59,1,10962,100,111,116,59,1,8943,4,7,100,101,108,112,114,118,119,8507,8522,8536,8550,8600,8697,8702,97,114,114,4,2,108,114,8516,8519,59,1,10552,59,1,10549,4,2,112,115,8528,8532,114,59,1,8926,99,59,1,8927,97,114,114,4,2,59,112,8545,8547,1,8630,59,1,10557,4,6,59,98,99,100,111,115,8564,8566,8573,8587,8592,8596,1,8746,114,99,97,112,59,1,10824,4,2,97,117,8579,8583,112,59,1,10822,112,59,1,10826,111,116,59,1,8845,114,59,1,10821,59,3,8746,65024,4,4,97,108,114,118,8610,8623,8663,8672,114,114,4,2,59,109,8618,8620,1,8631,59,1,10556,121,4,3,101,118,119,8632,8651,8656,113,4,2,112,115,8639,8645,114,101,99,59,1,8926,117,99,99,59,1,8927,101,101,59,1,8910,101,100,103,101,59,1,8911,101,110,5,164,1,59,8670,1,164,101,97,114,114,111,119,4,2,108,114,8684,8690,101,102,116,59,1,8630,105,103,104,116,59,1,8631,101,101,59,1,8910,101,100,59,1,8911,4,2,99,105,8713,8721,111,110,105,110,116,59,1,8754,110,116,59,1,8753,108,99,116,121,59,1,9005,4,19,65,72,97,98,99,100,101,102,104,105,106,108,111,114,115,116,117,119,122,8773,8778,8783,8821,8839,8854,8887,8914,8930,8944,9036,9041,9058,9197,9227,9258,9281,9297,9305,114,114,59,1,8659,97,114,59,1,10597,4,4,103,108,114,115,8793,8799,8805,8809,103,101,114,59,1,8224,101,116,104,59,1,8504,114,59,1,8595,104,4,2,59,118,8816,8818,1,8208,59,1,8867,4,2,107,108,8827,8834,97,114,111,119,59,1,10511,97,99,59,1,733,4,2,97,121,8845,8851,114,111,110,59,1,271,59,1,1076,4,3,59,97,111,8862,8864,8880,1,8518,4,2,103,114,8870,8876,103,101,114,59,1,8225,114,59,1,8650,116,115,101,113,59,1,10871,4,3,103,108,109,8895,8902,8907,5,176,1,59,8900,1,176,116,97,59,1,948,112,116,121,118,59,1,10673,4,2,105,114,8920,8926,115,104,116,59,1,10623,59,3,55349,56609,97,114,4,2,108,114,8938,8941,59,1,8643,59,1,8642,4,5,97,101,103,115,118,8956,8986,8989,8996,9001,109,4,3,59,111,115,8965,8967,8983,1,8900,110,100,4,2,59,115,8975,8977,1,8900,117,105,116,59,1,9830,59,1,9830,59,1,168,97,109,109,97,59,1,989,105,110,59,1,8946,4,3,59,105,111,9009,9011,9031,1,247,100,101,5,247,2,59,111,9020,9022,1,247,110,116,105,109,101,115,59,1,8903,110,120,59,1,8903,99,121,59,1,1106,99,4,2,111,114,9048,9053,114,110,59,1,8990,111,112,59,1,8973,4,5,108,112,116,117,119,9070,9076,9081,9130,9144,108,97,114,59,1,36,102,59,3,55349,56661,4,5,59,101,109,112,115,9093,9095,9109,9116,9122,1,729,113,4,2,59,100,9102,9104,1,8784,111,116,59,1,8785,105,110,117,115,59,1,8760,108,117,115,59,1,8724,113,117,97,114,101,59,1,8865,98,108,101,98,97,114,119,101,100,103,101,59,1,8966,110,4,3,97,100,104,9153,9160,9172,114,114,111,119,59,1,8595,111,119,110,97,114,114,111,119,115,59,1,8650,97,114,112,111,111,110,4,2,108,114,9184,9190,101,102,116,59,1,8643,105,103,104,116,59,1,8642,4,2,98,99,9203,9211,107,97,114,111,119,59,1,10512,4,2,111,114,9217,9222,114,110,59,1,8991,111,112,59,1,8972,4,3,99,111,116,9235,9248,9252,4,2,114,121,9241,9245,59,3,55349,56505,59,1,1109,108,59,1,10742,114,111,107,59,1,273,4,2,100,114,9264,9269,111,116,59,1,8945,105,4,2,59,102,9276,9278,1,9663,59,1,9662,4,2,97,104,9287,9292,114,114,59,1,8693,97,114,59,1,10607,97,110,103,108,101,59,1,10662,4,2,99,105,9311,9315,121,59,1,1119,103,114,97,114,114,59,1,10239,4,18,68,97,99,100,101,102,103,108,109,110,111,112,113,114,115,116,117,120,9361,9376,9398,9439,9444,9447,9462,9495,9531,9585,9598,9614,9659,9755,9771,9792,9808,9826,4,2,68,111,9367,9372,111,116,59,1,10871,116,59,1,8785,4,2,99,115,9382,9392,117,116,101,5,233,1,59,9390,1,233,116,101,114,59,1,10862,4,4,97,105,111,121,9408,9414,9430,9436,114,111,110,59,1,283,114,4,2,59,99,9421,9423,1,8790,5,234,1,59,9428,1,234,108,111,110,59,1,8789,59,1,1101,111,116,59,1,279,59,1,8519,4,2,68,114,9453,9458,111,116,59,1,8786,59,3,55349,56610,4,3,59,114,115,9470,9472,9482,1,10906,97,118,101,5,232,1,59,9480,1,232,4,2,59,100,9488,9490,1,10902,111,116,59,1,10904,4,4,59,105,108,115,9505,9507,9515,9518,1,10905,110,116,101,114,115,59,1,9191,59,1,8467,4,2,59,100,9524,9526,1,10901,111,116,59,1,10903,4,3,97,112,115,9539,9544,9564,99,114,59,1,275,116,121,4,3,59,115,118,9554,9556,9561,1,8709,101,116,59,1,8709,59,1,8709,112,4,2,49,59,9571,9583,4,2,51,52,9577,9580,59,1,8196,59,1,8197,1,8195,4,2,103,115,9591,9594,59,1,331,112,59,1,8194,4,2,103,112,9604,9609,111,110,59,1,281,102,59,3,55349,56662,4,3,97,108,115,9622,9635,9640,114,4,2,59,115,9629,9631,1,8917,108,59,1,10723,117,115,59,1,10865,105,4,3,59,108,118,9649,9651,9656,1,949,111,110,59,1,949,59,1,1013,4,4,99,115,117,118,9669,9686,9716,9747,4,2,105,111,9675,9680,114,99,59,1,8790,108,111,110,59,1,8789,4,2,105,108,9692,9696,109,59,1,8770,97,110,116,4,2,103,108,9705,9710,116,114,59,1,10902,101,115,115,59,1,10901,4,3,97,101,105,9724,9729,9734,108,115,59,1,61,115,116,59,1,8799,118,4,2,59,68,9741,9743,1,8801,68,59,1,10872,112,97,114,115,108,59,1,10725,4,2,68,97,9761,9766,111,116,59,1,8787,114,114,59,1,10609,4,3,99,100,105,9779,9783,9788,114,59,1,8495,111,116,59,1,8784,109,59,1,8770,4,2,97,104,9798,9801,59,1,951,5,240,1,59,9806,1,240,4,2,109,114,9814,9822,108,5,235,1,59,9820,1,235,111,59,1,8364,4,3,99,105,112,9834,9838,9843,108,59,1,33,115,116,59,1,8707,4,2,101,111,9849,9859,99,116,97,116,105,111,110,59,1,8496,110,101,110,116,105,97,108,101,59,1,8519,4,12,97,99,101,102,105,106,108,110,111,112,114,115,9896,9910,9914,9921,9954,9960,9967,9989,9994,10027,10036,10164,108,108,105,110,103,100,111,116,115,101,113,59,1,8786,121,59,1,1092,109,97,108,101,59,1,9792,4,3,105,108,114,9929,9935,9950,108,105,103,59,1,64259,4,2,105,108,9941,9945,103,59,1,64256,105,103,59,1,64260,59,3,55349,56611,108,105,103,59,1,64257,108,105,103,59,3,102,106,4,3,97,108,116,9975,9979,9984,116,59,1,9837,105,103,59,1,64258,110,115,59,1,9649,111,102,59,1,402,4,2,112,114,1e4,10005,102,59,3,55349,56663,4,2,97,107,10011,10016,108,108,59,1,8704,4,2,59,118,10022,10024,1,8916,59,1,10969,97,114,116,105,110,116,59,1,10765,4,2,97,111,10042,10159,4,2,99,115,10048,10155,4,6,49,50,51,52,53,55,10062,10102,10114,10135,10139,10151,4,6,50,51,52,53,54,56,10076,10083,10086,10093,10096,10099,5,189,1,59,10081,1,189,59,1,8531,5,188,1,59,10091,1,188,59,1,8533,59,1,8537,59,1,8539,4,2,51,53,10108,10111,59,1,8532,59,1,8534,4,3,52,53,56,10122,10129,10132,5,190,1,59,10127,1,190,59,1,8535,59,1,8540,53,59,1,8536,4,2,54,56,10145,10148,59,1,8538,59,1,8541,56,59,1,8542,108,59,1,8260,119,110,59,1,8994,99,114,59,3,55349,56507,4,17,69,97,98,99,100,101,102,103,105,106,108,110,111,114,115,116,118,10206,10217,10247,10254,10268,10273,10358,10363,10374,10380,10385,10406,10458,10464,10470,10497,10610,4,2,59,108,10212,10214,1,8807,59,1,10892,4,3,99,109,112,10225,10231,10244,117,116,101,59,1,501,109,97,4,2,59,100,10239,10241,1,947,59,1,989,59,1,10886,114,101,118,101,59,1,287,4,2,105,121,10260,10265,114,99,59,1,285,59,1,1075,111,116,59,1,289,4,4,59,108,113,115,10283,10285,10288,10308,1,8805,59,1,8923,4,3,59,113,115,10296,10298,10301,1,8805,59,1,8807,108,97,110,116,59,1,10878,4,4,59,99,100,108,10318,10320,10324,10345,1,10878,99,59,1,10921,111,116,4,2,59,111,10332,10334,1,10880,4,2,59,108,10340,10342,1,10882,59,1,10884,4,2,59,101,10351,10354,3,8923,65024,115,59,1,10900,114,59,3,55349,56612,4,2,59,103,10369,10371,1,8811,59,1,8921,109,101,108,59,1,8503,99,121,59,1,1107,4,4,59,69,97,106,10395,10397,10400,10403,1,8823,59,1,10898,59,1,10917,59,1,10916,4,4,69,97,101,115,10416,10419,10434,10453,59,1,8809,112,4,2,59,112,10426,10428,1,10890,114,111,120,59,1,10890,4,2,59,113,10440,10442,1,10888,4,2,59,113,10448,10450,1,10888,59,1,8809,105,109,59,1,8935,112,102,59,3,55349,56664,97,118,101,59,1,96,4,2,99,105,10476,10480,114,59,1,8458,109,4,3,59,101,108,10489,10491,10494,1,8819,59,1,10894,59,1,10896,5,62,6,59,99,100,108,113,114,10512,10514,10527,10532,10538,10545,1,62,4,2,99,105,10520,10523,59,1,10919,114,59,1,10874,111,116,59,1,8919,80,97,114,59,1,10645,117,101,115,116,59,1,10876,4,5,97,100,101,108,115,10557,10574,10579,10599,10605,4,2,112,114,10563,10570,112,114,111,120,59,1,10886,114,59,1,10616,111,116,59,1,8919,113,4,2,108,113,10586,10592,101,115,115,59,1,8923,108,101,115,115,59,1,10892,101,115,115,59,1,8823,105,109,59,1,8819,4,2,101,110,10616,10626,114,116,110,101,113,113,59,3,8809,65024,69,59,3,8809,65024,4,10,65,97,98,99,101,102,107,111,115,121,10653,10658,10713,10718,10724,10760,10765,10786,10850,10875,114,114,59,1,8660,4,4,105,108,109,114,10668,10674,10678,10684,114,115,112,59,1,8202,102,59,1,189,105,108,116,59,1,8459,4,2,100,114,10690,10695,99,121,59,1,1098,4,3,59,99,119,10703,10705,10710,1,8596,105,114,59,1,10568,59,1,8621,97,114,59,1,8463,105,114,99,59,1,293,4,3,97,108,114,10732,10748,10754,114,116,115,4,2,59,117,10741,10743,1,9829,105,116,59,1,9829,108,105,112,59,1,8230,99,111,110,59,1,8889,114,59,3,55349,56613,115,4,2,101,119,10772,10779,97,114,111,119,59,1,10533,97,114,111,119,59,1,10534,4,5,97,109,111,112,114,10798,10803,10809,10839,10844,114,114,59,1,8703,116,104,116,59,1,8763,107,4,2,108,114,10816,10827,101,102,116,97,114,114,111,119,59,1,8617,105,103,104,116,97,114,114,111,119,59,1,8618,102,59,3,55349,56665,98,97,114,59,1,8213,4,3,99,108,116,10858,10863,10869,114,59,3,55349,56509,97,115,104,59,1,8463,114,111,107,59,1,295,4,2,98,112,10881,10887,117,108,108,59,1,8259,104,101,110,59,1,8208,4,15,97,99,101,102,103,105,106,109,110,111,112,113,115,116,117,10925,10936,10958,10977,10990,11001,11039,11045,11101,11192,11220,11226,11237,11285,11299,99,117,116,101,5,237,1,59,10934,1,237,4,3,59,105,121,10944,10946,10955,1,8291,114,99,5,238,1,59,10953,1,238,59,1,1080,4,2,99,120,10964,10968,121,59,1,1077,99,108,5,161,1,59,10975,1,161,4,2,102,114,10983,10986,59,1,8660,59,3,55349,56614,114,97,118,101,5,236,1,59,10999,1,236,4,4,59,105,110,111,11011,11013,11028,11034,1,8520,4,2,105,110,11019,11024,110,116,59,1,10764,116,59,1,8749,102,105,110,59,1,10716,116,97,59,1,8489,108,105,103,59,1,307,4,3,97,111,112,11053,11092,11096,4,3,99,103,116,11061,11065,11088,114,59,1,299,4,3,101,108,112,11073,11076,11082,59,1,8465,105,110,101,59,1,8464,97,114,116,59,1,8465,104,59,1,305,102,59,1,8887,101,100,59,1,437,4,5,59,99,102,111,116,11113,11115,11121,11136,11142,1,8712,97,114,101,59,1,8453,105,110,4,2,59,116,11129,11131,1,8734,105,101,59,1,10717,100,111,116,59,1,305,4,5,59,99,101,108,112,11154,11156,11161,11179,11186,1,8747,97,108,59,1,8890,4,2,103,114,11167,11173,101,114,115,59,1,8484,99,97,108,59,1,8890,97,114,104,107,59,1,10775,114,111,100,59,1,10812,4,4,99,103,112,116,11202,11206,11211,11216,121,59,1,1105,111,110,59,1,303,102,59,3,55349,56666,97,59,1,953,114,111,100,59,1,10812,117,101,115,116,5,191,1,59,11235,1,191,4,2,99,105,11243,11248,114,59,3,55349,56510,110,4,5,59,69,100,115,118,11261,11263,11266,11271,11282,1,8712,59,1,8953,111,116,59,1,8949,4,2,59,118,11277,11279,1,8948,59,1,8947,59,1,8712,4,2,59,105,11291,11293,1,8290,108,100,101,59,1,297,4,2,107,109,11305,11310,99,121,59,1,1110,108,5,239,1,59,11316,1,239,4,6,99,102,109,111,115,117,11332,11346,11351,11357,11363,11380,4,2,105,121,11338,11343,114,99,59,1,309,59,1,1081,114,59,3,55349,56615,97,116,104,59,1,567,112,102,59,3,55349,56667,4,2,99,101,11369,11374,114,59,3,55349,56511,114,99,121,59,1,1112,107,99,121,59,1,1108,4,8,97,99,102,103,104,106,111,115,11404,11418,11433,11438,11445,11450,11455,11461,112,112,97,4,2,59,118,11413,11415,1,954,59,1,1008,4,2,101,121,11424,11430,100,105,108,59,1,311,59,1,1082,114,59,3,55349,56616,114,101,101,110,59,1,312,99,121,59,1,1093,99,121,59,1,1116,112,102,59,3,55349,56668,99,114,59,3,55349,56512,4,23,65,66,69,72,97,98,99,100,101,102,103,104,106,108,109,110,111,112,114,115,116,117,118,11515,11538,11544,11555,11560,11721,11780,11818,11868,12136,12160,12171,12203,12208,12246,12275,12327,12509,12523,12569,12641,12732,12752,4,3,97,114,116,11523,11528,11532,114,114,59,1,8666,114,59,1,8656,97,105,108,59,1,10523,97,114,114,59,1,10510,4,2,59,103,11550,11552,1,8806,59,1,10891,97,114,59,1,10594,4,9,99,101,103,109,110,112,113,114,116,11580,11586,11594,11600,11606,11624,11627,11636,11694,117,116,101,59,1,314,109,112,116,121,118,59,1,10676,114,97,110,59,1,8466,98,100,97,59,1,955,103,4,3,59,100,108,11615,11617,11620,1,10216,59,1,10641,101,59,1,10216,59,1,10885,117,111,5,171,1,59,11634,1,171,114,4,8,59,98,102,104,108,112,115,116,11655,11657,11669,11673,11677,11681,11685,11690,1,8592,4,2,59,102,11663,11665,1,8676,115,59,1,10527,115,59,1,10525,107,59,1,8617,112,59,1,8619,108,59,1,10553,105,109,59,1,10611,108,59,1,8610,4,3,59,97,101,11702,11704,11709,1,10923,105,108,59,1,10521,4,2,59,115,11715,11717,1,10925,59,3,10925,65024,4,3,97,98,114,11729,11734,11739,114,114,59,1,10508,114,107,59,1,10098,4,2,97,107,11745,11758,99,4,2,101,107,11752,11755,59,1,123,59,1,91,4,2,101,115,11764,11767,59,1,10635,108,4,2,100,117,11774,11777,59,1,10639,59,1,10637,4,4,97,101,117,121,11790,11796,11811,11815,114,111,110,59,1,318,4,2,100,105,11802,11807,105,108,59,1,316,108,59,1,8968,98,59,1,123,59,1,1083,4,4,99,113,114,115,11828,11832,11845,11864,97,59,1,10550,117,111,4,2,59,114,11840,11842,1,8220,59,1,8222,4,2,100,117,11851,11857,104,97,114,59,1,10599,115,104,97,114,59,1,10571,104,59,1,8626,4,5,59,102,103,113,115,11880,11882,12008,12011,12031,1,8804,116,4,5,97,104,108,114,116,11895,11913,11935,11947,11996,114,114,111,119,4,2,59,116,11905,11907,1,8592,97,105,108,59,1,8610,97,114,112,111,111,110,4,2,100,117,11925,11931,111,119,110,59,1,8637,112,59,1,8636,101,102,116,97,114,114,111,119,115,59,1,8647,105,103,104,116,4,3,97,104,115,11959,11974,11984,114,114,111,119,4,2,59,115,11969,11971,1,8596,59,1,8646,97,114,112,111,111,110,115,59,1,8651,113,117,105,103,97,114,114,111,119,59,1,8621,104,114,101,101,116,105,109,101,115,59,1,8907,59,1,8922,4,3,59,113,115,12019,12021,12024,1,8804,59,1,8806,108,97,110,116,59,1,10877,4,5,59,99,100,103,115,12043,12045,12049,12070,12083,1,10877,99,59,1,10920,111,116,4,2,59,111,12057,12059,1,10879,4,2,59,114,12065,12067,1,10881,59,1,10883,4,2,59,101,12076,12079,3,8922,65024,115,59,1,10899,4,5,97,100,101,103,115,12095,12103,12108,12126,12131,112,112,114,111,120,59,1,10885,111,116,59,1,8918,113,4,2,103,113,12115,12120,116,114,59,1,8922,103,116,114,59,1,10891,116,114,59,1,8822,105,109,59,1,8818,4,3,105,108,114,12144,12150,12156,115,104,116,59,1,10620,111,111,114,59,1,8970,59,3,55349,56617,4,2,59,69,12166,12168,1,8822,59,1,10897,4,2,97,98,12177,12198,114,4,2,100,117,12184,12187,59,1,8637,4,2,59,108,12193,12195,1,8636,59,1,10602,108,107,59,1,9604,99,121,59,1,1113,4,5,59,97,99,104,116,12220,12222,12227,12235,12241,1,8810,114,114,59,1,8647,111,114,110,101,114,59,1,8990,97,114,100,59,1,10603,114,105,59,1,9722,4,2,105,111,12252,12258,100,111,116,59,1,320,117,115,116,4,2,59,97,12267,12269,1,9136,99,104,101,59,1,9136,4,4,69,97,101,115,12285,12288,12303,12322,59,1,8808,112,4,2,59,112,12295,12297,1,10889,114,111,120,59,1,10889,4,2,59,113,12309,12311,1,10887,4,2,59,113,12317,12319,1,10887,59,1,8808,105,109,59,1,8934,4,8,97,98,110,111,112,116,119,122,12345,12359,12364,12421,12446,12467,12474,12490,4,2,110,114,12351,12355,103,59,1,10220,114,59,1,8701,114,107,59,1,10214,103,4,3,108,109,114,12373,12401,12409,101,102,116,4,2,97,114,12382,12389,114,114,111,119,59,1,10229,105,103,104,116,97,114,114,111,119,59,1,10231,97,112,115,116,111,59,1,10236,105,103,104,116,97,114,114,111,119,59,1,10230,112,97,114,114,111,119,4,2,108,114,12433,12439,101,102,116,59,1,8619,105,103,104,116,59,1,8620,4,3,97,102,108,12454,12458,12462,114,59,1,10629,59,3,55349,56669,117,115,59,1,10797,105,109,101,115,59,1,10804,4,2,97,98,12480,12485,115,116,59,1,8727,97,114,59,1,95,4,3,59,101,102,12498,12500,12506,1,9674,110,103,101,59,1,9674,59,1,10731,97,114,4,2,59,108,12517,12519,1,40,116,59,1,10643,4,5,97,99,104,109,116,12535,12540,12548,12561,12564,114,114,59,1,8646,111,114,110,101,114,59,1,8991,97,114,4,2,59,100,12556,12558,1,8651,59,1,10605,59,1,8206,114,105,59,1,8895,4,6,97,99,104,105,113,116,12583,12589,12594,12597,12614,12635,113,117,111,59,1,8249,114,59,3,55349,56513,59,1,8624,109,4,3,59,101,103,12606,12608,12611,1,8818,59,1,10893,59,1,10895,4,2,98,117,12620,12623,59,1,91,111,4,2,59,114,12630,12632,1,8216,59,1,8218,114,111,107,59,1,322,5,60,8,59,99,100,104,105,108,113,114,12660,12662,12675,12680,12686,12692,12698,12705,1,60,4,2,99,105,12668,12671,59,1,10918,114,59,1,10873,111,116,59,1,8918,114,101,101,59,1,8907,109,101,115,59,1,8905,97,114,114,59,1,10614,117,101,115,116,59,1,10875,4,2,80,105,12711,12716,97,114,59,1,10646,4,3,59,101,102,12724,12726,12729,1,9667,59,1,8884,59,1,9666,114,4,2,100,117,12739,12746,115,104,97,114,59,1,10570,104,97,114,59,1,10598,4,2,101,110,12758,12768,114,116,110,101,113,113,59,3,8808,65024,69,59,3,8808,65024,4,14,68,97,99,100,101,102,104,105,108,110,111,112,115,117,12803,12809,12893,12908,12914,12928,12933,12937,13011,13025,13032,13049,13052,13069,68,111,116,59,1,8762,4,4,99,108,112,114,12819,12827,12849,12887,114,5,175,1,59,12825,1,175,4,2,101,116,12833,12836,59,1,9794,4,2,59,101,12842,12844,1,10016,115,101,59,1,10016,4,2,59,115,12855,12857,1,8614,116,111,4,4,59,100,108,117,12869,12871,12877,12883,1,8614,111,119,110,59,1,8615,101,102,116,59,1,8612,112,59,1,8613,107,101,114,59,1,9646,4,2,111,121,12899,12905,109,109,97,59,1,10793,59,1,1084,97,115,104,59,1,8212,97,115,117,114,101,100,97,110,103,108,101,59,1,8737,114,59,3,55349,56618,111,59,1,8487,4,3,99,100,110,12945,12954,12985,114,111,5,181,1,59,12952,1,181,4,4,59,97,99,100,12964,12966,12971,12976,1,8739,115,116,59,1,42,105,114,59,1,10992,111,116,5,183,1,59,12983,1,183,117,115,4,3,59,98,100,12995,12997,13e3,1,8722,59,1,8863,4,2,59,117,13006,13008,1,8760,59,1,10794,4,2,99,100,13017,13021,112,59,1,10971,114,59,1,8230,112,108,117,115,59,1,8723,4,2,100,112,13038,13044,101,108,115,59,1,8871,102,59,3,55349,56670,59,1,8723,4,2,99,116,13058,13063,114,59,3,55349,56514,112,111,115,59,1,8766,4,3,59,108,109,13077,13079,13087,1,956,116,105,109,97,112,59,1,8888,97,112,59,1,8888,4,24,71,76,82,86,97,98,99,100,101,102,103,104,105,106,108,109,111,112,114,115,116,117,118,119,13142,13165,13217,13229,13247,13330,13359,13414,13420,13508,13513,13579,13602,13626,13631,13762,13767,13855,13936,13995,14214,14285,14312,14432,4,2,103,116,13148,13152,59,3,8921,824,4,2,59,118,13158,13161,3,8811,8402,59,3,8811,824,4,3,101,108,116,13173,13200,13204,102,116,4,2,97,114,13181,13188,114,114,111,119,59,1,8653,105,103,104,116,97,114,114,111,119,59,1,8654,59,3,8920,824,4,2,59,118,13210,13213,3,8810,8402,59,3,8810,824,105,103,104,116,97,114,114,111,119,59,1,8655,4,2,68,100,13235,13241,97,115,104,59,1,8879,97,115,104,59,1,8878,4,5,98,99,110,112,116,13259,13264,13270,13275,13308,108,97,59,1,8711,117,116,101,59,1,324,103,59,3,8736,8402,4,5,59,69,105,111,112,13287,13289,13293,13298,13302,1,8777,59,3,10864,824,100,59,3,8779,824,115,59,1,329,114,111,120,59,1,8777,117,114,4,2,59,97,13316,13318,1,9838,108,4,2,59,115,13325,13327,1,9838,59,1,8469,4,2,115,117,13336,13344,112,5,160,1,59,13342,1,160,109,112,4,2,59,101,13352,13355,3,8782,824,59,3,8783,824,4,5,97,101,111,117,121,13371,13385,13391,13407,13411,4,2,112,114,13377,13380,59,1,10819,111,110,59,1,328,100,105,108,59,1,326,110,103,4,2,59,100,13399,13401,1,8775,111,116,59,3,10861,824,112,59,1,10818,59,1,1085,97,115,104,59,1,8211,4,7,59,65,97,100,113,115,120,13436,13438,13443,13466,13472,13478,13494,1,8800,114,114,59,1,8663,114,4,2,104,114,13450,13454,107,59,1,10532,4,2,59,111,13460,13462,1,8599,119,59,1,8599,111,116,59,3,8784,824,117,105,118,59,1,8802,4,2,101,105,13484,13489,97,114,59,1,10536,109,59,3,8770,824,105,115,116,4,2,59,115,13503,13505,1,8708,59,1,8708,114,59,3,55349,56619,4,4,69,101,115,116,13523,13527,13563,13568,59,3,8807,824,4,3,59,113,115,13535,13537,13559,1,8817,4,3,59,113,115,13545,13547,13551,1,8817,59,3,8807,824,108,97,110,116,59,3,10878,824,59,3,10878,824,105,109,59,1,8821,4,2,59,114,13574,13576,1,8815,59,1,8815,4,3,65,97,112,13587,13592,13597,114,114,59,1,8654,114,114,59,1,8622,97,114,59,1,10994,4,3,59,115,118,13610,13612,13623,1,8715,4,2,59,100,13618,13620,1,8956,59,1,8954,59,1,8715,99,121,59,1,1114,4,7,65,69,97,100,101,115,116,13647,13652,13656,13661,13665,13737,13742,114,114,59,1,8653,59,3,8806,824,114,114,59,1,8602,114,59,1,8229,4,4,59,102,113,115,13675,13677,13703,13725,1,8816,116,4,2,97,114,13684,13691,114,114,111,119,59,1,8602,105,103,104,116,97,114,114,111,119,59,1,8622,4,3,59,113,115,13711,13713,13717,1,8816,59,3,8806,824,108,97,110,116,59,3,10877,824,4,2,59,115,13731,13734,3,10877,824,59,1,8814,105,109,59,1,8820,4,2,59,114,13748,13750,1,8814,105,4,2,59,101,13757,13759,1,8938,59,1,8940,105,100,59,1,8740,4,2,112,116,13773,13778,102,59,3,55349,56671,5,172,3,59,105,110,13787,13789,13829,1,172,110,4,4,59,69,100,118,13800,13802,13806,13812,1,8713,59,3,8953,824,111,116,59,3,8949,824,4,3,97,98,99,13820,13823,13826,59,1,8713,59,1,8951,59,1,8950,105,4,2,59,118,13836,13838,1,8716,4,3,97,98,99,13846,13849,13852,59,1,8716,59,1,8958,59,1,8957,4,3,97,111,114,13863,13892,13899,114,4,4,59,97,115,116,13874,13876,13883,13888,1,8742,108,108,101,108,59,1,8742,108,59,3,11005,8421,59,3,8706,824,108,105,110,116,59,1,10772,4,3,59,99,101,13907,13909,13914,1,8832,117,101,59,1,8928,4,2,59,99,13920,13923,3,10927,824,4,2,59,101,13929,13931,1,8832,113,59,3,10927,824,4,4,65,97,105,116,13946,13951,13971,13982,114,114,59,1,8655,114,114,4,3,59,99,119,13961,13963,13967,1,8603,59,3,10547,824,59,3,8605,824,103,104,116,97,114,114,111,119,59,1,8603,114,105,4,2,59,101,13990,13992,1,8939,59,1,8941,4,7,99,104,105,109,112,113,117,14011,14036,14060,14080,14085,14090,14106,4,4,59,99,101,114,14021,14023,14028,14032,1,8833,117,101,59,1,8929,59,3,10928,824,59,3,55349,56515,111,114,116,4,2,109,112,14045,14050,105,100,59,1,8740,97,114,97,108,108,101,108,59,1,8742,109,4,2,59,101,14067,14069,1,8769,4,2,59,113,14075,14077,1,8772,59,1,8772,105,100,59,1,8740,97,114,59,1,8742,115,117,4,2,98,112,14098,14102,101,59,1,8930,101,59,1,8931,4,3,98,99,112,14114,14157,14171,4,4,59,69,101,115,14124,14126,14130,14133,1,8836,59,3,10949,824,59,1,8840,101,116,4,2,59,101,14141,14144,3,8834,8402,113,4,2,59,113,14151,14153,1,8840,59,3,10949,824,99,4,2,59,101,14164,14166,1,8833,113,59,3,10928,824,4,4,59,69,101,115,14181,14183,14187,14190,1,8837,59,3,10950,824,59,1,8841,101,116,4,2,59,101,14198,14201,3,8835,8402,113,4,2,59,113,14208,14210,1,8841,59,3,10950,824,4,4,103,105,108,114,14224,14228,14238,14242,108,59,1,8825,108,100,101,5,241,1,59,14236,1,241,103,59,1,8824,105,97,110,103,108,101,4,2,108,114,14254,14269,101,102,116,4,2,59,101,14263,14265,1,8938,113,59,1,8940,105,103,104,116,4,2,59,101,14279,14281,1,8939,113,59,1,8941,4,2,59,109,14291,14293,1,957,4,3,59,101,115,14301,14303,14308,1,35,114,111,59,1,8470,112,59,1,8199,4,9,68,72,97,100,103,105,108,114,115,14332,14338,14344,14349,14355,14369,14376,14408,14426,97,115,104,59,1,8877,97,114,114,59,1,10500,112,59,3,8781,8402,97,115,104,59,1,8876,4,2,101,116,14361,14365,59,3,8805,8402,59,3,62,8402,110,102,105,110,59,1,10718,4,3,65,101,116,14384,14389,14393,114,114,59,1,10498,59,3,8804,8402,4,2,59,114,14399,14402,3,60,8402,105,101,59,3,8884,8402,4,2,65,116,14414,14419,114,114,59,1,10499,114,105,101,59,3,8885,8402,105,109,59,3,8764,8402,4,3,65,97,110,14440,14445,14468,114,114,59,1,8662,114,4,2,104,114,14452,14456,107,59,1,10531,4,2,59,111,14462,14464,1,8598,119,59,1,8598,101,97,114,59,1,10535,4,18,83,97,99,100,101,102,103,104,105,108,109,111,112,114,115,116,117,118,14512,14515,14535,14560,14597,14603,14618,14643,14657,14662,14701,14741,14747,14769,14851,14877,14907,14916,59,1,9416,4,2,99,115,14521,14531,117,116,101,5,243,1,59,14529,1,243,116,59,1,8859,4,2,105,121,14541,14557,114,4,2,59,99,14548,14550,1,8858,5,244,1,59,14555,1,244,59,1,1086,4,5,97,98,105,111,115,14572,14577,14583,14587,14591,115,104,59,1,8861,108,97,99,59,1,337,118,59,1,10808,116,59,1,8857,111,108,100,59,1,10684,108,105,103,59,1,339,4,2,99,114,14609,14614,105,114,59,1,10687,59,3,55349,56620,4,3,111,114,116,14626,14630,14640,110,59,1,731,97,118,101,5,242,1,59,14638,1,242,59,1,10689,4,2,98,109,14649,14654,97,114,59,1,10677,59,1,937,110,116,59,1,8750,4,4,97,99,105,116,14672,14677,14693,14698,114,114,59,1,8634,4,2,105,114,14683,14687,114,59,1,10686,111,115,115,59,1,10683,110,101,59,1,8254,59,1,10688,4,3,97,101,105,14709,14714,14719,99,114,59,1,333,103,97,59,1,969,4,3,99,100,110,14727,14733,14736,114,111,110,59,1,959,59,1,10678,117,115,59,1,8854,112,102,59,3,55349,56672,4,3,97,101,108,14755,14759,14764,114,59,1,10679,114,112,59,1,10681,117,115,59,1,8853,4,7,59,97,100,105,111,115,118,14785,14787,14792,14831,14837,14841,14848,1,8744,114,114,59,1,8635,4,4,59,101,102,109,14802,14804,14817,14824,1,10845,114,4,2,59,111,14811,14813,1,8500,102,59,1,8500,5,170,1,59,14822,1,170,5,186,1,59,14829,1,186,103,111,102,59,1,8886,114,59,1,10838,108,111,112,101,59,1,10839,59,1,10843,4,3,99,108,111,14859,14863,14873,114,59,1,8500,97,115,104,5,248,1,59,14871,1,248,108,59,1,8856,105,4,2,108,109,14884,14893,100,101,5,245,1,59,14891,1,245,101,115,4,2,59,97,14901,14903,1,8855,115,59,1,10806,109,108,5,246,1,59,14914,1,246,98,97,114,59,1,9021,4,12,97,99,101,102,104,105,108,109,111,114,115,117,14948,14992,14996,15033,15038,15068,15090,15189,15192,15222,15427,15441,114,4,4,59,97,115,116,14959,14961,14976,14989,1,8741,5,182,2,59,108,14968,14970,1,182,108,101,108,59,1,8741,4,2,105,108,14982,14986,109,59,1,10995,59,1,11005,59,1,8706,121,59,1,1087,114,4,5,99,105,109,112,116,15009,15014,15019,15024,15027,110,116,59,1,37,111,100,59,1,46,105,108,59,1,8240,59,1,8869,101,110,107,59,1,8241,114,59,3,55349,56621,4,3,105,109,111,15046,15057,15063,4,2,59,118,15052,15054,1,966,59,1,981,109,97,116,59,1,8499,110,101,59,1,9742,4,3,59,116,118,15076,15078,15087,1,960,99,104,102,111,114,107,59,1,8916,59,1,982,4,2,97,117,15096,15119,110,4,2,99,107,15103,15115,107,4,2,59,104,15110,15112,1,8463,59,1,8462,118,59,1,8463,115,4,9,59,97,98,99,100,101,109,115,116,15140,15142,15148,15151,15156,15168,15171,15179,15184,1,43,99,105,114,59,1,10787,59,1,8862,105,114,59,1,10786,4,2,111,117,15162,15165,59,1,8724,59,1,10789,59,1,10866,110,5,177,1,59,15177,1,177,105,109,59,1,10790,119,111,59,1,10791,59,1,177,4,3,105,112,117,15200,15208,15213,110,116,105,110,116,59,1,10773,102,59,3,55349,56673,110,100,5,163,1,59,15220,1,163,4,10,59,69,97,99,101,105,110,111,115,117,15244,15246,15249,15253,15258,15334,15347,15367,15416,15421,1,8826,59,1,10931,112,59,1,10935,117,101,59,1,8828,4,2,59,99,15264,15266,1,10927,4,6,59,97,99,101,110,115,15280,15282,15290,15299,15303,15329,1,8826,112,112,114,111,120,59,1,10935,117,114,108,121,101,113,59,1,8828,113,59,1,10927,4,3,97,101,115,15311,15319,15324,112,112,114,111,120,59,1,10937,113,113,59,1,10933,105,109,59,1,8936,105,109,59,1,8830,109,101,4,2,59,115,15342,15344,1,8242,59,1,8473,4,3,69,97,115,15355,15358,15362,59,1,10933,112,59,1,10937,105,109,59,1,8936,4,3,100,102,112,15375,15378,15404,59,1,8719,4,3,97,108,115,15386,15392,15398,108,97,114,59,1,9006,105,110,101,59,1,8978,117,114,102,59,1,8979,4,2,59,116,15410,15412,1,8733,111,59,1,8733,105,109,59,1,8830,114,101,108,59,1,8880,4,2,99,105,15433,15438,114,59,3,55349,56517,59,1,968,110,99,115,112,59,1,8200,4,6,102,105,111,112,115,117,15462,15467,15472,15478,15485,15491,114,59,3,55349,56622,110,116,59,1,10764,112,102,59,3,55349,56674,114,105,109,101,59,1,8279,99,114,59,3,55349,56518,4,3,97,101,111,15499,15520,15534,116,4,2,101,105,15506,15515,114,110,105,111,110,115,59,1,8461,110,116,59,1,10774,115,116,4,2,59,101,15528,15530,1,63,113,59,1,8799,116,5,34,1,59,15540,1,34,4,21,65,66,72,97,98,99,100,101,102,104,105,108,109,110,111,112,114,115,116,117,120,15586,15609,15615,15620,15796,15855,15893,15931,15977,16001,16039,16183,16204,16222,16228,16285,16312,16318,16363,16408,16416,4,3,97,114,116,15594,15599,15603,114,114,59,1,8667,114,59,1,8658,97,105,108,59,1,10524,97,114,114,59,1,10511,97,114,59,1,10596,4,7,99,100,101,110,113,114,116,15636,15651,15656,15664,15687,15696,15770,4,2,101,117,15642,15646,59,3,8765,817,116,101,59,1,341,105,99,59,1,8730,109,112,116,121,118,59,1,10675,103,4,4,59,100,101,108,15675,15677,15680,15683,1,10217,59,1,10642,59,1,10661,101,59,1,10217,117,111,5,187,1,59,15694,1,187,114,4,11,59,97,98,99,102,104,108,112,115,116,119,15721,15723,15727,15739,15742,15746,15750,15754,15758,15763,15767,1,8594,112,59,1,10613,4,2,59,102,15733,15735,1,8677,115,59,1,10528,59,1,10547,115,59,1,10526,107,59,1,8618,112,59,1,8620,108,59,1,10565,105,109,59,1,10612,108,59,1,8611,59,1,8605,4,2,97,105,15776,15781,105,108,59,1,10522,111,4,2,59,110,15788,15790,1,8758,97,108,115,59,1,8474,4,3,97,98,114,15804,15809,15814,114,114,59,1,10509,114,107,59,1,10099,4,2,97,107,15820,15833,99,4,2,101,107,15827,15830,59,1,125,59,1,93,4,2,101,115,15839,15842,59,1,10636,108,4,2,100,117,15849,15852,59,1,10638,59,1,10640,4,4,97,101,117,121,15865,15871,15886,15890,114,111,110,59,1,345,4,2,100,105,15877,15882,105,108,59,1,343,108,59,1,8969,98,59,1,125,59,1,1088,4,4,99,108,113,115,15903,15907,15914,15927,97,59,1,10551,100,104,97,114,59,1,10601,117,111,4,2,59,114,15922,15924,1,8221,59,1,8221,104,59,1,8627,4,3,97,99,103,15939,15966,15970,108,4,4,59,105,112,115,15950,15952,15957,15963,1,8476,110,101,59,1,8475,97,114,116,59,1,8476,59,1,8477,116,59,1,9645,5,174,1,59,15975,1,174,4,3,105,108,114,15985,15991,15997,115,104,116,59,1,10621,111,111,114,59,1,8971,59,3,55349,56623,4,2,97,111,16007,16028,114,4,2,100,117,16014,16017,59,1,8641,4,2,59,108,16023,16025,1,8640,59,1,10604,4,2,59,118,16034,16036,1,961,59,1,1009,4,3,103,110,115,16047,16167,16171,104,116,4,6,97,104,108,114,115,116,16063,16081,16103,16130,16143,16155,114,114,111,119,4,2,59,116,16073,16075,1,8594,97,105,108,59,1,8611,97,114,112,111,111,110,4,2,100,117,16093,16099,111,119,110,59,1,8641,112,59,1,8640,101,102,116,4,2,97,104,16112,16120,114,114,111,119,115,59,1,8644,97,114,112,111,111,110,115,59,1,8652,105,103,104,116,97,114,114,111,119,115,59,1,8649,113,117,105,103,97,114,114,111,119,59,1,8605,104,114,101,101,116,105,109,101,115,59,1,8908,103,59,1,730,105,110,103,100,111,116,115,101,113,59,1,8787,4,3,97,104,109,16191,16196,16201,114,114,59,1,8644,97,114,59,1,8652,59,1,8207,111,117,115,116,4,2,59,97,16214,16216,1,9137,99,104,101,59,1,9137,109,105,100,59,1,10990,4,4,97,98,112,116,16238,16252,16257,16278,4,2,110,114,16244,16248,103,59,1,10221,114,59,1,8702,114,107,59,1,10215,4,3,97,102,108,16265,16269,16273,114,59,1,10630,59,3,55349,56675,117,115,59,1,10798,105,109,101,115,59,1,10805,4,2,97,112,16291,16304,114,4,2,59,103,16298,16300,1,41,116,59,1,10644,111,108,105,110,116,59,1,10770,97,114,114,59,1,8649,4,4,97,99,104,113,16328,16334,16339,16342,113,117,111,59,1,8250,114,59,3,55349,56519,59,1,8625,4,2,98,117,16348,16351,59,1,93,111,4,2,59,114,16358,16360,1,8217,59,1,8217,4,3,104,105,114,16371,16377,16383,114,101,101,59,1,8908,109,101,115,59,1,8906,105,4,4,59,101,102,108,16394,16396,16399,16402,1,9657,59,1,8885,59,1,9656,116,114,105,59,1,10702,108,117,104,97,114,59,1,10600,59,1,8478,4,19,97,98,99,100,101,102,104,105,108,109,111,112,113,114,115,116,117,119,122,16459,16466,16472,16572,16590,16672,16687,16746,16844,16850,16924,16963,16988,17115,17121,17154,17206,17614,17656,99,117,116,101,59,1,347,113,117,111,59,1,8218,4,10,59,69,97,99,101,105,110,112,115,121,16494,16496,16499,16513,16518,16531,16536,16556,16564,16569,1,8827,59,1,10932,4,2,112,114,16505,16508,59,1,10936,111,110,59,1,353,117,101,59,1,8829,4,2,59,100,16524,16526,1,10928,105,108,59,1,351,114,99,59,1,349,4,3,69,97,115,16544,16547,16551,59,1,10934,112,59,1,10938,105,109,59,1,8937,111,108,105,110,116,59,1,10771,105,109,59,1,8831,59,1,1089,111,116,4,3,59,98,101,16582,16584,16587,1,8901,59,1,8865,59,1,10854,4,7,65,97,99,109,115,116,120,16606,16611,16634,16642,16646,16652,16668,114,114,59,1,8664,114,4,2,104,114,16618,16622,107,59,1,10533,4,2,59,111,16628,16630,1,8600,119,59,1,8600,116,5,167,1,59,16640,1,167,105,59,1,59,119,97,114,59,1,10537,109,4,2,105,110,16659,16665,110,117,115,59,1,8726,59,1,8726,116,59,1,10038,114,4,2,59,111,16679,16682,3,55349,56624,119,110,59,1,8994,4,4,97,99,111,121,16697,16702,16716,16739,114,112,59,1,9839,4,2,104,121,16708,16713,99,121,59,1,1097,59,1,1096,114,116,4,2,109,112,16724,16729,105,100,59,1,8739,97,114,97,108,108,101,108,59,1,8741,5,173,1,59,16744,1,173,4,2,103,109,16752,16770,109,97,4,3,59,102,118,16762,16764,16767,1,963,59,1,962,59,1,962,4,8,59,100,101,103,108,110,112,114,16788,16790,16795,16806,16817,16828,16832,16838,1,8764,111,116,59,1,10858,4,2,59,113,16801,16803,1,8771,59,1,8771,4,2,59,69,16812,16814,1,10910,59,1,10912,4,2,59,69,16823,16825,1,10909,59,1,10911,101,59,1,8774,108,117,115,59,1,10788,97,114,114,59,1,10610,97,114,114,59,1,8592,4,4,97,101,105,116,16860,16883,16891,16904,4,2,108,115,16866,16878,108,115,101,116,109,105,110,117,115,59,1,8726,104,112,59,1,10803,112,97,114,115,108,59,1,10724,4,2,100,108,16897,16900,59,1,8739,101,59,1,8995,4,2,59,101,16910,16912,1,10922,4,2,59,115,16918,16920,1,10924,59,3,10924,65024,4,3,102,108,112,16932,16938,16958,116,99,121,59,1,1100,4,2,59,98,16944,16946,1,47,4,2,59,97,16952,16954,1,10692,114,59,1,9023,102,59,3,55349,56676,97,4,2,100,114,16970,16985,101,115,4,2,59,117,16978,16980,1,9824,105,116,59,1,9824,59,1,8741,4,3,99,115,117,16996,17028,17089,4,2,97,117,17002,17015,112,4,2,59,115,17009,17011,1,8851,59,3,8851,65024,112,4,2,59,115,17022,17024,1,8852,59,3,8852,65024,117,4,2,98,112,17035,17062,4,3,59,101,115,17043,17045,17048,1,8847,59,1,8849,101,116,4,2,59,101,17056,17058,1,8847,113,59,1,8849,4,3,59,101,115,17070,17072,17075,1,8848,59,1,8850,101,116,4,2,59,101,17083,17085,1,8848,113,59,1,8850,4,3,59,97,102,17097,17099,17112,1,9633,114,4,2,101,102,17106,17109,59,1,9633,59,1,9642,59,1,9642,97,114,114,59,1,8594,4,4,99,101,109,116,17131,17136,17142,17148,114,59,3,55349,56520,116,109,110,59,1,8726,105,108,101,59,1,8995,97,114,102,59,1,8902,4,2,97,114,17160,17172,114,4,2,59,102,17167,17169,1,9734,59,1,9733,4,2,97,110,17178,17202,105,103,104,116,4,2,101,112,17188,17197,112,115,105,108,111,110,59,1,1013,104,105,59,1,981,115,59,1,175,4,5,98,99,109,110,112,17218,17351,17420,17423,17427,4,9,59,69,100,101,109,110,112,114,115,17238,17240,17243,17248,17261,17267,17279,17285,17291,1,8834,59,1,10949,111,116,59,1,10941,4,2,59,100,17254,17256,1,8838,111,116,59,1,10947,117,108,116,59,1,10945,4,2,69,101,17273,17276,59,1,10955,59,1,8842,108,117,115,59,1,10943,97,114,114,59,1,10617,4,3,101,105,117,17299,17335,17339,116,4,3,59,101,110,17308,17310,17322,1,8834,113,4,2,59,113,17317,17319,1,8838,59,1,10949,101,113,4,2,59,113,17330,17332,1,8842,59,1,10955,109,59,1,10951,4,2,98,112,17345,17348,59,1,10965,59,1,10963,99,4,6,59,97,99,101,110,115,17366,17368,17376,17385,17389,17415,1,8827,112,112,114,111,120,59,1,10936,117,114,108,121,101,113,59,1,8829,113,59,1,10928,4,3,97,101,115,17397,17405,17410,112,112,114,111,120,59,1,10938,113,113,59,1,10934,105,109,59,1,8937,105,109,59,1,8831,59,1,8721,103,59,1,9834,4,13,49,50,51,59,69,100,101,104,108,109,110,112,115,17455,17462,17469,17476,17478,17481,17496,17509,17524,17530,17536,17548,17554,5,185,1,59,17460,1,185,5,178,1,59,17467,1,178,5,179,1,59,17474,1,179,1,8835,59,1,10950,4,2,111,115,17487,17491,116,59,1,10942,117,98,59,1,10968,4,2,59,100,17502,17504,1,8839,111,116,59,1,10948,115,4,2,111,117,17516,17520,108,59,1,10185,98,59,1,10967,97,114,114,59,1,10619,117,108,116,59,1,10946,4,2,69,101,17542,17545,59,1,10956,59,1,8843,108,117,115,59,1,10944,4,3,101,105,117,17562,17598,17602,116,4,3,59,101,110,17571,17573,17585,1,8835,113,4,2,59,113,17580,17582,1,8839,59,1,10950,101,113,4,2,59,113,17593,17595,1,8843,59,1,10956,109,59,1,10952,4,2,98,112,17608,17611,59,1,10964,59,1,10966,4,3,65,97,110,17622,17627,17650,114,114,59,1,8665,114,4,2,104,114,17634,17638,107,59,1,10534,4,2,59,111,17644,17646,1,8601,119,59,1,8601,119,97,114,59,1,10538,108,105,103,5,223,1,59,17664,1,223,4,13,97,98,99,100,101,102,104,105,111,112,114,115,119,17694,17709,17714,17737,17742,17749,17754,17860,17905,17957,17964,18090,18122,4,2,114,117,17700,17706,103,101,116,59,1,8982,59,1,964,114,107,59,1,9140,4,3,97,101,121,17722,17728,17734,114,111,110,59,1,357,100,105,108,59,1,355,59,1,1090,111,116,59,1,8411,108,114,101,99,59,1,8981,114,59,3,55349,56625,4,4,101,105,107,111,17764,17805,17836,17851,4,2,114,116,17770,17786,101,4,2,52,102,17777,17780,59,1,8756,111,114,101,59,1,8756,97,4,3,59,115,118,17795,17797,17802,1,952,121,109,59,1,977,59,1,977,4,2,99,110,17811,17831,107,4,2,97,115,17818,17826,112,112,114,111,120,59,1,8776,105,109,59,1,8764,115,112,59,1,8201,4,2,97,115,17842,17846,112,59,1,8776,105,109,59,1,8764,114,110,5,254,1,59,17858,1,254,4,3,108,109,110,17868,17873,17901,100,101,59,1,732,101,115,5,215,3,59,98,100,17884,17886,17898,1,215,4,2,59,97,17892,17894,1,8864,114,59,1,10801,59,1,10800,116,59,1,8749,4,3,101,112,115,17913,17917,17953,97,59,1,10536,4,4,59,98,99,102,17927,17929,17934,17939,1,8868,111,116,59,1,9014,105,114,59,1,10993,4,2,59,111,17945,17948,3,55349,56677,114,107,59,1,10970,97,59,1,10537,114,105,109,101,59,1,8244,4,3,97,105,112,17972,17977,18082,100,101,59,1,8482,4,7,97,100,101,109,112,115,116,17993,18051,18056,18059,18066,18072,18076,110,103,108,101,4,5,59,100,108,113,114,18009,18011,18017,18032,18035,1,9653,111,119,110,59,1,9663,101,102,116,4,2,59,101,18026,18028,1,9667,113,59,1,8884,59,1,8796,105,103,104,116,4,2,59,101,18045,18047,1,9657,113,59,1,8885,111,116,59,1,9708,59,1,8796,105,110,117,115,59,1,10810,108,117,115,59,1,10809,98,59,1,10701,105,109,101,59,1,10811,101,122,105,117,109,59,1,9186,4,3,99,104,116,18098,18111,18116,4,2,114,121,18104,18108,59,3,55349,56521,59,1,1094,99,121,59,1,1115,114,111,107,59,1,359,4,2,105,111,18128,18133,120,116,59,1,8812,104,101,97,100,4,2,108,114,18143,18154,101,102,116,97,114,114,111,119,59,1,8606,105,103,104,116,97,114,114,111,119,59,1,8608,4,18,65,72,97,98,99,100,102,103,104,108,109,111,112,114,115,116,117,119,18204,18209,18214,18234,18250,18268,18292,18308,18319,18343,18379,18397,18413,18504,18547,18553,18584,18603,114,114,59,1,8657,97,114,59,1,10595,4,2,99,114,18220,18230,117,116,101,5,250,1,59,18228,1,250,114,59,1,8593,114,4,2,99,101,18241,18245,121,59,1,1118,118,101,59,1,365,4,2,105,121,18256,18265,114,99,5,251,1,59,18263,1,251,59,1,1091,4,3,97,98,104,18276,18281,18287,114,114,59,1,8645,108,97,99,59,1,369,97,114,59,1,10606,4,2,105,114,18298,18304,115,104,116,59,1,10622,59,3,55349,56626,114,97,118,101,5,249,1,59,18317,1,249,4,2,97,98,18325,18338,114,4,2,108,114,18332,18335,59,1,8639,59,1,8638,108,107,59,1,9600,4,2,99,116,18349,18374,4,2,111,114,18355,18369,114,110,4,2,59,101,18363,18365,1,8988,114,59,1,8988,111,112,59,1,8975,114,105,59,1,9720,4,2,97,108,18385,18390,99,114,59,1,363,5,168,1,59,18395,1,168,4,2,103,112,18403,18408,111,110,59,1,371,102,59,3,55349,56678,4,6,97,100,104,108,115,117,18427,18434,18445,18470,18475,18494,114,114,111,119,59,1,8593,111,119,110,97,114,114,111,119,59,1,8597,97,114,112,111,111,110,4,2,108,114,18457,18463,101,102,116,59,1,8639,105,103,104,116,59,1,8638,117,115,59,1,8846,105,4,3,59,104,108,18484,18486,18489,1,965,59,1,978,111,110,59,1,965,112,97,114,114,111,119,115,59,1,8648,4,3,99,105,116,18512,18537,18542,4,2,111,114,18518,18532,114,110,4,2,59,101,18526,18528,1,8989,114,59,1,8989,111,112,59,1,8974,110,103,59,1,367,114,105,59,1,9721,99,114,59,3,55349,56522,4,3,100,105,114,18561,18566,18572,111,116,59,1,8944,108,100,101,59,1,361,105,4,2,59,102,18579,18581,1,9653,59,1,9652,4,2,97,109,18590,18595,114,114,59,1,8648,108,5,252,1,59,18601,1,252,97,110,103,108,101,59,1,10663,4,15,65,66,68,97,99,100,101,102,108,110,111,112,114,115,122,18643,18648,18661,18667,18847,18851,18857,18904,18909,18915,18931,18937,18943,18949,18996,114,114,59,1,8661,97,114,4,2,59,118,18656,18658,1,10984,59,1,10985,97,115,104,59,1,8872,4,2,110,114,18673,18679,103,114,116,59,1,10652,4,7,101,107,110,112,114,115,116,18695,18704,18711,18720,18742,18754,18810,112,115,105,108,111,110,59,1,1013,97,112,112,97,59,1,1008,111,116,104,105,110,103,59,1,8709,4,3,104,105,114,18728,18732,18735,105,59,1,981,59,1,982,111,112,116,111,59,1,8733,4,2,59,104,18748,18750,1,8597,111,59,1,1009,4,2,105,117,18760,18766,103,109,97,59,1,962,4,2,98,112,18772,18791,115,101,116,110,101,113,4,2,59,113,18784,18787,3,8842,65024,59,3,10955,65024,115,101,116,110,101,113,4,2,59,113,18803,18806,3,8843,65024,59,3,10956,65024,4,2,104,114,18816,18822,101,116,97,59,1,977,105,97,110,103,108,101,4,2,108,114,18834,18840,101,102,116,59,1,8882,105,103,104,116,59,1,8883,121,59,1,1074,97,115,104,59,1,8866,4,3,101,108,114,18865,18884,18890,4,3,59,98,101,18873,18875,18880,1,8744,97,114,59,1,8891,113,59,1,8794,108,105,112,59,1,8942,4,2,98,116,18896,18901,97,114,59,1,124,59,1,124,114,59,3,55349,56627,116,114,105,59,1,8882,115,117,4,2,98,112,18923,18927,59,3,8834,8402,59,3,8835,8402,112,102,59,3,55349,56679,114,111,112,59,1,8733,116,114,105,59,1,8883,4,2,99,117,18955,18960,114,59,3,55349,56523,4,2,98,112,18966,18981,110,4,2,69,101,18973,18977,59,3,10955,65024,59,3,8842,65024,110,4,2,69,101,18988,18992,59,3,10956,65024,59,3,8843,65024,105,103,122,97,103,59,1,10650,4,7,99,101,102,111,112,114,115,19020,19026,19061,19066,19072,19075,19089,105,114,99,59,1,373,4,2,100,105,19032,19055,4,2,98,103,19038,19043,97,114,59,1,10847,101,4,2,59,113,19050,19052,1,8743,59,1,8793,101,114,112,59,1,8472,114,59,3,55349,56628,112,102,59,3,55349,56680,59,1,8472,4,2,59,101,19081,19083,1,8768,97,116,104,59,1,8768,99,114,59,3,55349,56524,4,14,99,100,102,104,105,108,109,110,111,114,115,117,118,119,19125,19146,19152,19157,19173,19176,19192,19197,19202,19236,19252,19269,19286,19291,4,3,97,105,117,19133,19137,19142,112,59,1,8898,114,99,59,1,9711,112,59,1,8899,116,114,105,59,1,9661,114,59,3,55349,56629,4,2,65,97,19163,19168,114,114,59,1,10234,114,114,59,1,10231,59,1,958,4,2,65,97,19182,19187,114,114,59,1,10232,114,114,59,1,10229,97,112,59,1,10236,105,115,59,1,8955,4,3,100,112,116,19210,19215,19230,111,116,59,1,10752,4,2,102,108,19221,19225,59,3,55349,56681,117,115,59,1,10753,105,109,101,59,1,10754,4,2,65,97,19242,19247,114,114,59,1,10233,114,114,59,1,10230,4,2,99,113,19258,19263,114,59,3,55349,56525,99,117,112,59,1,10758,4,2,112,116,19275,19281,108,117,115,59,1,10756,114,105,59,1,9651,101,101,59,1,8897,101,100,103,101,59,1,8896,4,8,97,99,101,102,105,111,115,117,19316,19335,19349,19357,19362,19367,19373,19379,99,4,2,117,121,19323,19332,116,101,5,253,1,59,19330,1,253,59,1,1103,4,2,105,121,19341,19346,114,99,59,1,375,59,1,1099,110,5,165,1,59,19355,1,165,114,59,3,55349,56630,99,121,59,1,1111,112,102,59,3,55349,56682,99,114,59,3,55349,56526,4,2,99,109,19385,19389,121,59,1,1102,108,5,255,1,59,19395,1,255,4,10,97,99,100,101,102,104,105,111,115,119,19419,19426,19441,19446,19462,19467,19472,19480,19486,19492,99,117,116,101,59,1,378,4,2,97,121,19432,19438,114,111,110,59,1,382,59,1,1079,111,116,59,1,380,4,2,101,116,19452,19458,116,114,102,59,1,8488,97,59,1,950,114,59,3,55349,56631,99,121,59,1,1078,103,114,97,114,114,59,1,8669,112,102,59,3,55349,56683,99,114,59,3,55349,56527,4,2,106,110,19498,19501,59,1,8205,106,59,1,8204])},77118:function(e,t,n){"use strict";let r=n(54284),i=n(41734),a=r.CODE_POINTS;e.exports=class{constructor(){this.html=null,this.pos=-1,this.lastGapPos=-1,this.lastCharPos=-1,this.gapStack=[],this.skipNextNewLine=!1,this.lastChunkWritten=!1,this.endOfChunkHit=!1,this.bufferWaterline=65536}_err(){}_addGap(){this.gapStack.push(this.lastGapPos),this.lastGapPos=this.pos}_processSurrogate(e){if(this.pos!==this.lastCharPos){let t=this.html.charCodeAt(this.pos+1);if(r.isSurrogatePair(t))return this.pos++,this._addGap(),r.getSurrogatePairCodePoint(e,t)}else if(!this.lastChunkWritten)return this.endOfChunkHit=!0,a.EOF;return this._err(i.surrogateInInputStream),e}dropParsedChunk(){this.pos>this.bufferWaterline&&(this.lastCharPos-=this.pos,this.html=this.html.substring(this.pos),this.pos=0,this.lastGapPos=-1,this.gapStack=[])}write(e,t){this.html?this.html+=e:this.html=e,this.lastCharPos=this.html.length-1,this.endOfChunkHit=!1,this.lastChunkWritten=t}insertHtmlAtCurrentPos(e){this.html=this.html.substring(0,this.pos+1)+e+this.html.substring(this.pos+1,this.html.length),this.lastCharPos=this.html.length-1,this.endOfChunkHit=!1}advance(){if(this.pos++,this.pos>this.lastCharPos)return this.endOfChunkHit=!this.lastChunkWritten,a.EOF;let e=this.html.charCodeAt(this.pos);if(this.skipNextNewLine&&e===a.LINE_FEED)return this.skipNextNewLine=!1,this._addGap(),this.advance();if(e===a.CARRIAGE_RETURN)return this.skipNextNewLine=!0,a.LINE_FEED;this.skipNextNewLine=!1,r.isSurrogate(e)&&(e=this._processSurrogate(e));let t=e>31&&e<127||e===a.LINE_FEED||e===a.CARRIAGE_RETURN||e>159&&e<64976;return t||this._checkForProblematicCharacters(e),e}_checkForProblematicCharacters(e){r.isControlCodePoint(e)?this._err(i.controlCharacterInInputStream):r.isUndefinedCodePoint(e)&&this._err(i.noncharacterInInputStream)}retreat(){this.pos===this.lastGapPos&&(this.lastGapPos=this.gapStack.pop(),this.pos--),this.pos--}}},17296:function(e,t,n){"use strict";let{DOCUMENT_MODE:r}=n(16152);t.createDocument=function(){return{nodeName:"#document",mode:r.NO_QUIRKS,childNodes:[]}},t.createDocumentFragment=function(){return{nodeName:"#document-fragment",childNodes:[]}},t.createElement=function(e,t,n){return{nodeName:e,tagName:e,attrs:n,namespaceURI:t,childNodes:[],parentNode:null}},t.createCommentNode=function(e){return{nodeName:"#comment",data:e,parentNode:null}};let createTextNode=function(e){return{nodeName:"#text",value:e,parentNode:null}},i=t.appendChild=function(e,t){e.childNodes.push(t),t.parentNode=e},a=t.insertBefore=function(e,t,n){let r=e.childNodes.indexOf(n);e.childNodes.splice(r,0,t),t.parentNode=e};t.setTemplateContent=function(e,t){e.content=t},t.getTemplateContent=function(e){return e.content},t.setDocumentType=function(e,t,n,r){let a=null;for(let t=0;t(Object.keys(t).forEach(n=>{e[n]=t[n]}),e),Object.create(null))}},81704:function(e){"use strict";let Mixin=class Mixin{constructor(e){let t={},n=this._getOverriddenMethods(this,t);for(let r of Object.keys(n))"function"==typeof n[r]&&(t[r]=e[r],e[r]=n[r])}_getOverriddenMethods(){throw Error("Not implemented")}};Mixin.install=function(e,t,n){e.__mixins||(e.__mixins=[]);for(let n=0;n/g,">").replace(/"/g,""").replace(/'/g,"'")}function inherit$1(e,...t){let n=Object.create(null);for(let t in e)n[t]=e[t];return t.forEach(function(e){for(let t in e)n[t]=e[t]}),n}let emitsWrappingTags=e=>!!e.scope,scopeToCSSClass=(e,{prefix:t})=>{if(e.startsWith("language:"))return e.replace("language:","language-");if(e.includes(".")){let n=e.split(".");return[`${t}${n.shift()}`,...n.map((e,t)=>`${e}${"_".repeat(t+1)}`)].join(" ")}return`${t}${e}`};let HTMLRenderer=class HTMLRenderer{constructor(e,t){this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){this.buffer+=escapeHTML(e)}openNode(e){if(!emitsWrappingTags(e))return;let t=scopeToCSSClass(e.scope,{prefix:this.classPrefix});this.span(t)}closeNode(e){emitsWrappingTags(e)&&(this.buffer+="")}value(){return this.buffer}span(e){this.buffer+=``}};let newNode=(e={})=>{let t={children:[]};return Object.assign(t,e),t};let TokenTree=class TokenTree{constructor(){this.rootNode=newNode(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){let t=newNode({scope:e});this.add(t),this.stack.push(t)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t),t.children.forEach(t=>this._walk(e,t)),e.closeNode(t)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{TokenTree._collapse(e)}))}};let TokenTreeEmitter=class TokenTreeEmitter extends TokenTree{constructor(e){super(),this.options=e}addText(e){""!==e&&this.add(e)}startScope(e){this.openNode(e)}endScope(){this.closeNode()}__addSublanguage(e,t){let n=e.root;t&&(n.scope=`language:${t}`),this.add(n)}toHTML(){let e=new HTMLRenderer(this,this.options);return e.value()}finalize(){return this.closeAllNodes(),!0}};function source(e){return e?"string"==typeof e?e:e.source:null}function lookahead(e){return concat("(?=",e,")")}function anyNumberOfTimes(e){return concat("(?:",e,")*")}function optional(e){return concat("(?:",e,")?")}function concat(...e){let t=e.map(e=>source(e)).join("");return t}function either(...e){let t=function(e){let t=e[e.length-1];return"object"==typeof t&&t.constructor===Object?(e.splice(e.length-1,1),t):{}}(e),n="("+(t.capture?"":"?:")+e.map(e=>source(e)).join("|")+")";return n}function countMatchGroups(e){return RegExp(e.toString()+"|").exec("").length-1}let t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function _rewriteBackreferences(e,{joinWith:n}){let r=0;return e.map(e=>{r+=1;let n=r,i=source(e),a="";for(;i.length>0;){let e=t.exec(i);if(!e){a+=i;break}a+=i.substring(0,e.index),i=i.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?a+="\\"+String(Number(e[1])+n):(a+=e[0],"("===e[0]&&r++)}return a}).map(e=>`(${e})`).join(n)}let n="[a-zA-Z]\\w*",r="[a-zA-Z_]\\w*",i="\\b\\d+(\\.\\d+)?",a="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",o="\\b(0b[01]+)",s={begin:"\\\\[\\s\\S]",relevance:0},COMMENT=function(e,t,n={}){let r=inherit$1({scope:"comment",begin:e,end:t,contains:[]},n);r.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});let i=either("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return r.contains.push({begin:concat(/[ ]+/,"(",i,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),r},l=COMMENT("//","$"),c=COMMENT("/\\*","\\*/"),u=COMMENT("#","$");var d=Object.freeze({__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:n,UNDERSCORE_IDENT_RE:r,NUMBER_RE:i,C_NUMBER_RE:a,BINARY_NUMBER_RE:o,RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{let t=/^#![ ]*\//;return e.binary&&(e.begin=concat(t,/.*\b/,e.binary,/\b.*/)),inherit$1({scope:"meta",begin:t,end:/$/,relevance:0,"on:begin":(e,t)=>{0!==e.index&&t.ignoreMatch()}},e)},BACKSLASH_ESCAPE:s,APOS_STRING_MODE:{scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[s]},QUOTE_STRING_MODE:{scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[s]},PHRASAL_WORDS_MODE:{begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},COMMENT:COMMENT,C_LINE_COMMENT_MODE:l,C_BLOCK_COMMENT_MODE:c,HASH_COMMENT_MODE:u,NUMBER_MODE:{scope:"number",begin:i,relevance:0},C_NUMBER_MODE:{scope:"number",begin:a,relevance:0},BINARY_NUMBER_MODE:{scope:"number",begin:o,relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{scope:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[s,{begin:/\[/,end:/\]/,relevance:0,contains:[s]}]}]},TITLE_MODE:{scope:"title",begin:n,relevance:0},UNDERSCORE_TITLE_MODE:{scope:"title",begin:r,relevance:0},METHOD_GUARD:{begin:"\\.\\s*"+r,relevance:0},END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{t.data._beginMatch!==e[1]&&t.ignoreMatch()}})}});function skipIfHasPrecedingDot(e,t){let n=e.input[e.index-1];"."===n&&t.ignoreMatch()}function scopeClassName(e,t){void 0!==e.className&&(e.scope=e.className,delete e.className)}function beginKeywords(e,t){t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",e.__beforeBegin=skipIfHasPrecedingDot,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords,void 0===e.relevance&&(e.relevance=0))}function compileIllegal(e,t){Array.isArray(e.illegal)&&(e.illegal=either(...e.illegal))}function compileMatch(e,t){if(e.match){if(e.begin||e.end)throw Error("begin & end are not supported with match");e.begin=e.match,delete e.match}}function compileRelevance(e,t){void 0===e.relevance&&(e.relevance=1)}let beforeMatchExt=(e,t)=>{if(!e.beforeMatch)return;if(e.starts)throw Error("beforeMatch cannot be used with starts");let n=Object.assign({},e);Object.keys(e).forEach(t=>{delete e[t]}),e.keywords=n.keywords,e.begin=concat(n.beforeMatch,lookahead(n.begin)),e.starts={relevance:0,contains:[Object.assign(n,{endsParent:!0})]},e.relevance=0,delete n.beforeMatch},p=["of","and","for","in","not","or","if","then","parent","list","value"],f={},error=e=>{console.error(e)},warn=(e,...t)=>{console.log(`WARN: ${e}`,...t)},deprecated=(e,t)=>{f[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),f[`${e}/${t}`]=!0)},m=Error();function remapScopeNames(e,t,{key:n}){let r=0,i=e[n],a={},o={};for(let e=1;e<=t.length;e++)o[e+r]=i[e],a[e+r]=!0,r+=countMatchGroups(t[e-1]);e[n]=o,e[n]._emit=a,e[n]._multi=!0}function MultiClass(e){e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope,delete e.scope),"string"==typeof e.beginScope&&(e.beginScope={_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope}),function(e){if(Array.isArray(e.begin)){if(e.skip||e.excludeBegin||e.returnBegin)throw error("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),m;if("object"!=typeof e.beginScope||null===e.beginScope)throw error("beginScope must be object"),m;remapScopeNames(e,e.begin,{key:"beginScope"}),e.begin=_rewriteBackreferences(e.begin,{joinWith:""})}}(e),function(e){if(Array.isArray(e.end)){if(e.skip||e.excludeEnd||e.returnEnd)throw error("skip, excludeEnd, returnEnd not compatible with endScope: {}"),m;if("object"!=typeof e.endScope||null===e.endScope)throw error("endScope must be object"),m;remapScopeNames(e,e.end,{key:"endScope"}),e.end=_rewriteBackreferences(e.end,{joinWith:""})}}(e)}let HTMLInjectionError=class HTMLInjectionError extends Error{constructor(e,t){super(e),this.name="HTMLInjectionError",this.html=t}};let g=Symbol("nomatch"),HLJS=function(e){let t=Object.create(null),n=Object.create(null),r=[],i=!0,a="Could not find the language '{}', did you forget to load/include a language module?",o={disableAutodetect:!0,name:"Plain text",contains:[]},s={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:TokenTreeEmitter};function shouldNotHighlight(e){return s.noHighlightRe.test(e)}function highlight(e,t,n){let r="",i="";"object"==typeof t?(r=e,n=t.ignoreIllegals,i=t.language):(deprecated("10.7.0","highlight(lang, code, ...args) has been deprecated."),deprecated("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"),i=e,r=t),void 0===n&&(n=!0);let a={code:r,language:i};fire("before:highlight",a);let o=a.result?a.result:_highlight(a.language,a.code,n);return o.code=a.code,fire("after:highlight",o),o}function _highlight(e,n,r,o){let l=Object.create(null);function processKeywords(){if(!m.keywords){b.addText(T);return}let e=0;m.keywordPatternRe.lastIndex=0;let t=m.keywordPatternRe.exec(T),n="";for(;t;){n+=T.substring(e,t.index);let r=u.case_insensitive?t[0].toLowerCase():t[0],i=m.keywords[r];if(i){let[e,a]=i;if(b.addText(n),n="",l[r]=(l[r]||0)+1,l[r]<=7&&(_+=a),e.startsWith("_"))n+=t[0];else{let n=u.classNameAliases[e]||e;emitKeyword(t[0],n)}}else n+=t[0];e=m.keywordPatternRe.lastIndex,t=m.keywordPatternRe.exec(T)}n+=T.substring(e),b.addText(n)}function processBuffer(){null!=m.subLanguage?function(){if(""===T)return;let e=null;if("string"==typeof m.subLanguage){if(!t[m.subLanguage]){b.addText(T);return}e=_highlight(m.subLanguage,T,!0,E[m.subLanguage]),E[m.subLanguage]=e._top}else e=highlightAuto(T,m.subLanguage.length?m.subLanguage:null);m.relevance>0&&(_+=e.relevance),b.__addSublanguage(e._emitter,e.language)}():processKeywords(),T=""}function emitKeyword(e,t){""!==e&&(b.startScope(t),b.addText(e),b.endScope())}function emitMultiClass(e,t){let n=1,r=t.length-1;for(;n<=r;){if(!e._emit[n]){n++;continue}let r=u.classNameAliases[e[n]]||e[n],i=t[n];r?emitKeyword(i,r):(T=i,processKeywords(),T=""),n++}}function startNewMode(e,t){return e.scope&&"string"==typeof e.scope&&b.openNode(u.classNameAliases[e.scope]||e.scope),e.beginScope&&(e.beginScope._wrap?(emitKeyword(T,u.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap),T=""):e.beginScope._multi&&(emitMultiClass(e.beginScope,t),T="")),m=Object.create(e,{parent:{value:m}})}let c={};function processLexeme(t,a){let o=a&&a[0];if(T+=t,null==o)return processBuffer(),0;if("begin"===c.type&&"end"===a.type&&c.index===a.index&&""===o){if(T+=n.slice(a.index,a.index+1),!i){let t=Error(`0 width match regex (${e})`);throw t.languageName=e,t.badRule=c.rule,t}return 1}if(c=a,"begin"===a.type)return function(e){let t=e[0],n=e.rule,r=new Response(n),i=[n.__beforeBegin,n["on:begin"]];for(let n of i)if(n&&(n(e,r),r.isMatchIgnored))return 0===m.matcher.regexIndex?(T+=t[0],1):(y=!0,0);return n.skip?T+=t:(n.excludeBegin&&(T+=t),processBuffer(),n.returnBegin||n.excludeBegin||(T=t)),startNewMode(n,e),n.returnBegin?0:t.length}(a);if("illegal"!==a.type||r){if("end"===a.type){let e=function(e){let t=e[0],r=n.substring(e.index),i=function endOfMode(e,t,n){let r=function(e,t){let n=e&&e.exec(t);return n&&0===n.index}(e.endRe,n);if(r){if(e["on:end"]){let n=new Response(e);e["on:end"](t,n),n.isMatchIgnored&&(r=!1)}if(r){for(;e.endsParent&&e.parent;)e=e.parent;return e}}if(e.endsWithParent)return endOfMode(e.parent,t,n)}(m,e,r);if(!i)return g;let a=m;m.endScope&&m.endScope._wrap?(processBuffer(),emitKeyword(t,m.endScope._wrap)):m.endScope&&m.endScope._multi?(processBuffer(),emitMultiClass(m.endScope,e)):a.skip?T+=t:(a.returnEnd||a.excludeEnd||(T+=t),processBuffer(),a.excludeEnd&&(T=t));do m.scope&&b.closeNode(),m.skip||m.subLanguage||(_+=m.relevance),m=m.parent;while(m!==i.parent);return i.starts&&startNewMode(i.starts,e),a.returnEnd?0:t.length}(a);if(e!==g)return e}}else{let e=Error('Illegal lexeme "'+o+'" for mode "'+(m.scope||"")+'"');throw e.mode=m,e}if("illegal"===a.type&&""===o)return 1;if(C>1e5&&C>3*a.index){let e=Error("potential infinite loop, way more iterations than matches");throw e}return T+=o,o.length}let u=getLanguage(e);if(!u)throw error(a.replace("{}",e)),Error('Unknown language: "'+e+'"');let d=function(e){function langRe(t,n){return RegExp(source(t),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(n?"g":""))}let MultiRegex=class MultiRegex{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,t){t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]),this.matchAt+=countMatchGroups(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);let e=this.regexes.map(e=>e[1]);this.matcherRe=langRe(_rewriteBackreferences(e,{joinWith:"|"}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;let t=this.matcherRe.exec(e);if(!t)return null;let n=t.findIndex((e,t)=>t>0&&void 0!==e),r=this.matchIndexes[n];return t.splice(0,n),Object.assign(t,r)}};let ResumableMultiRegex=class ResumableMultiRegex{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];let t=new MultiRegex;return this.rules.slice(e).forEach(([e,n])=>t.addRule(e,n)),t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){let t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex;let n=t.exec(e);if(this.resumingScanAtSamePosition()){if(n&&n.index===this.lastIndex);else{let t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)}}return n&&(this.regexIndex+=n.position+1,this.regexIndex===this.count&&this.considerAll()),n}};if(e.compilerExtensions||(e.compilerExtensions=[]),e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return e.classNameAliases=inherit$1(e.classNameAliases||{}),function compileMode(t,n){if(t.isCompiled)return t;[scopeClassName,compileMatch,MultiClass,beforeMatchExt].forEach(e=>e(t,n)),e.compilerExtensions.forEach(e=>e(t,n)),t.__beforeBegin=null,[beginKeywords,compileIllegal,compileRelevance].forEach(e=>e(t,n)),t.isCompiled=!0;let r=null;return"object"==typeof t.keywords&&t.keywords.$pattern&&(t.keywords=Object.assign({},t.keywords),r=t.keywords.$pattern,delete t.keywords.$pattern),r=r||/\w+/,t.keywords&&(t.keywords=function compileKeywords(e,t,n="keyword"){let r=Object.create(null);return"string"==typeof e?compileList(n,e.split(" ")):Array.isArray(e)?compileList(n,e):Object.keys(e).forEach(function(n){Object.assign(r,compileKeywords(e[n],t,n))}),r;function compileList(e,n){t&&(n=n.map(e=>e.toLowerCase())),n.forEach(function(t){var n,i;let a=t.split("|");r[a[0]]=[e,(n=a[0],(i=a[1])?Number(i):p.includes(n.toLowerCase())?0:1)]})}}(t.keywords,e.case_insensitive)),t.keywordPatternRe=langRe(r,!0),n&&(t.begin||(t.begin=/\B|\b/),t.beginRe=langRe(t.begin),t.end||t.endsWithParent||(t.end=/\B|\b/),t.end&&(t.endRe=langRe(t.end)),t.terminatorEnd=source(t.end)||"",t.endsWithParent&&n.terminatorEnd&&(t.terminatorEnd+=(t.end?"|":"")+n.terminatorEnd)),t.illegal&&(t.illegalRe=langRe(t.illegal)),t.contains||(t.contains=[]),t.contains=[].concat(...t.contains.map(function(e){var n;return((n="self"===e?t:e).variants&&!n.cachedVariants&&(n.cachedVariants=n.variants.map(function(e){return inherit$1(n,{variants:null},e)})),n.cachedVariants)?n.cachedVariants:!function dependencyOnParent(e){return!!e&&(e.endsWithParent||dependencyOnParent(e.starts))}(n)?Object.isFrozen(n)?inherit$1(n):n:inherit$1(n,{starts:n.starts?inherit$1(n.starts):null})})),t.contains.forEach(function(e){compileMode(e,t)}),t.starts&&compileMode(t.starts,n),t.matcher=function(e){let t=new ResumableMultiRegex;return e.contains.forEach(e=>t.addRule(e.begin,{rule:e,type:"begin"})),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end"}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t}(t),t}(e)}(u),f="",m=o||d,E={},b=new s.__emitter(s);!function(){let e=[];for(let t=m;t!==u;t=t.parent)t.scope&&e.unshift(t.scope);e.forEach(e=>b.openNode(e))}();let T="",_=0,A=0,C=0,y=!1;try{if(u.__emitTokens)u.__emitTokens(n,b);else{for(m.matcher.considerAll();;){C++,y?y=!1:m.matcher.considerAll(),m.matcher.lastIndex=A;let e=m.matcher.exec(n);if(!e)break;let t=n.substring(A,e.index),r=processLexeme(t,e);A=e.index+r}processLexeme(n.substring(A))}return b.finalize(),f=b.toHTML(),{language:e,value:f,relevance:_,illegal:!1,_emitter:b,_top:m}}catch(t){if(t.message&&t.message.includes("Illegal"))return{language:e,value:escapeHTML(n),illegal:!0,relevance:0,_illegalBy:{message:t.message,index:A,context:n.slice(A-100,A+100),mode:t.mode,resultSoFar:f},_emitter:b};if(i)return{language:e,value:escapeHTML(n),illegal:!1,relevance:0,errorRaised:t,_emitter:b,_top:m};throw t}}function highlightAuto(e,n){n=n||s.languages||Object.keys(t);let r=function(e){let t={value:escapeHTML(e),illegal:!1,relevance:0,_top:o,_emitter:new s.__emitter(s)};return t._emitter.addText(e),t}(e),i=n.filter(getLanguage).filter(autoDetection).map(t=>_highlight(t,e,!1));i.unshift(r);let a=i.sort((e,t)=>{if(e.relevance!==t.relevance)return t.relevance-e.relevance;if(e.language&&t.language){if(getLanguage(e.language).supersetOf===t.language)return 1;if(getLanguage(t.language).supersetOf===e.language)return -1}return 0}),[l,c]=a;return l.secondBest=c,l}function highlightElement(e){let t=null,r=function(e){let t=e.className+" ";t+=e.parentNode?e.parentNode.className:"";let n=s.languageDetectRe.exec(t);if(n){let t=getLanguage(n[1]);return t||(warn(a.replace("{}",n[1])),warn("Falling back to no-highlight mode for this block.",e)),t?n[1]:"no-highlight"}return t.split(/\s+/).find(e=>shouldNotHighlight(e)||getLanguage(e))}(e);if(shouldNotHighlight(r))return;if(fire("before:highlightElement",{el:e,language:r}),e.children.length>0&&(s.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(e)),s.throwUnescapedHTML)){let t=new HTMLInjectionError("One of your code blocks includes unescaped HTML.",e.innerHTML);throw t}t=e;let i=t.textContent,o=r?highlight(i,{language:r,ignoreIllegals:!0}):highlightAuto(i);e.innerHTML=o.value,function(e,t,r){let i=t&&n[t]||r;e.classList.add("hljs"),e.classList.add(`language-${i}`)}(e,r,o.language),e.result={language:o.language,re:o.relevance,relevance:o.relevance},o.secondBest&&(e.secondBest={language:o.secondBest.language,relevance:o.secondBest.relevance}),fire("after:highlightElement",{el:e,result:o,text:i})}let l=!1;function highlightAll(){if("loading"===document.readyState){l=!0;return}let e=document.querySelectorAll(s.cssSelector);e.forEach(highlightElement)}function getLanguage(e){return t[e=(e||"").toLowerCase()]||t[n[e]]}function registerAliases(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach(e=>{n[e.toLowerCase()]=t})}function autoDetection(e){let t=getLanguage(e);return t&&!t.disableAutodetect}function fire(e,t){r.forEach(function(n){n[e]&&n[e](t)})}for(let a in"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",function(){l&&highlightAll()},!1),Object.assign(e,{highlight,highlightAuto,highlightAll,highlightElement,highlightBlock:function(e){return deprecated("10.7.0","highlightBlock will be removed entirely in v12.0"),deprecated("10.7.0","Please use highlightElement now."),highlightElement(e)},configure:function(e){s=inherit$1(s,e)},initHighlighting:()=>{highlightAll(),deprecated("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")},initHighlightingOnLoad:function(){highlightAll(),deprecated("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")},registerLanguage:function(n,r){let a=null;try{a=r(e)}catch(e){if(error("Language definition for '{}' could not be registered.".replace("{}",n)),i)error(e);else throw e;a=o}a.name||(a.name=n),t[n]=a,a.rawDefinition=r.bind(null,e),a.aliases&®isterAliases(a.aliases,{languageName:n})},unregisterLanguage:function(e){for(let r of(delete t[e],Object.keys(n)))n[r]===e&&delete n[r]},listLanguages:function(){return Object.keys(t)},getLanguage,registerAliases,autoDetection,inherit:inherit$1,addPlugin:function(e){var t;(t=e)["before:highlightBlock"]&&!t["before:highlightElement"]&&(t["before:highlightElement"]=e=>{t["before:highlightBlock"](Object.assign({block:e.el},e))}),t["after:highlightBlock"]&&!t["after:highlightElement"]&&(t["after:highlightElement"]=e=>{t["after:highlightBlock"](Object.assign({block:e.el},e))}),r.push(e)},removePlugin:function(e){let t=r.indexOf(e);-1!==t&&r.splice(t,1)}}),e.debugMode=function(){i=!1},e.safeMode=function(){i=!0},e.versionString="11.8.0",e.regex={concat:concat,lookahead:lookahead,either:either,optional:optional,anyNumberOfTimes:anyNumberOfTimes},d)"object"==typeof d[a]&&function deepFreeze(e){return e instanceof Map?e.clear=e.delete=e.set=function(){throw Error("map is read-only")}:e instanceof Set&&(e.add=e.clear=e.delete=function(){throw Error("set is read-only")}),Object.freeze(e),Object.getOwnPropertyNames(e).forEach(t=>{let n=e[t],r=typeof n;"object"!==r&&"function"!==r||Object.isFrozen(n)||deepFreeze(n)}),e}(d[a]);return Object.assign(e,d),e},E=HLJS({});E.newInstance=()=>HLJS({}),e.exports=E,E.HighlightJS=E,E.default=E},64777:function(e,t,n){"use strict";function ccount(e,t){let n=String(e);if("string"!=typeof t)throw TypeError("Expected character");let r=0,i=n.indexOf(t);for(;-1!==i;)r++,i=n.indexOf(t,i+t.length);return r}n.d(t,{w:function(){return ccount}})},25668:function(e,t,n){"use strict";function parse(e){let t=[],n=String(e||""),r=n.indexOf(","),i=0,a=!1;for(;!a;){-1===r&&(r=n.length,a=!0);let e=n.slice(i,r).trim();(e||!a)&&t.push(e),i=r+1,r=n.indexOf(",",i)}return t}function stringify(e,t){let n=t||{},r=""===e[e.length-1]?[...e,""]:e;return r.join((n.padRight?" ":"")+","+(!1===n.padLeft?"":" ")).trim()}n.d(t,{P:function(){return stringify},Q:function(){return parse}})},44301:function(e,t,n){"use strict";n.d(t,{T:function(){return decodeNamedCharacterReference}});let r=document.createElement("i");function decodeNamedCharacterReference(e){let t="&"+e+";";r.innerHTML=t;let n=r.textContent;return(59!==n.charCodeAt(n.length-1)||"semi"===e)&&n!==t&&n}},62718:function(e,t,n){"use strict";n.d(t,{e:function(){return fromParse5}});var r=n(91634),i=n(26103),a=n(93859);let o=/[#.]/g;var s=n(50342),l=n(25668);let c=new Set(["menu","submit","reset","button"]),u={}.hasOwnProperty;function core(e,t,n){let r=n&&function(e){let t={},n=-1;for(;++n-1&&ee)return{line:t+1,column:e-(t>0?n[t-1]:0)+1,offset:e}}return{line:void 0,column:void 0,offset:void 0}},toOffset:function(e){let t=e&&e.line,r=e&&e.column;if("number"==typeof t&&"number"==typeof r&&!Number.isNaN(t)&&!Number.isNaN(r)&&t-1 in n){let e=(n[t-2]||0)+r-1||0;if(e>-1&&e48&&n<55?n-48:null}n.d(t,{B:function(){return headingRank}})},36191:function(e,t,n){"use strict";n.d(t,{Y:function(){return convertElement}});let convertElement=function(e){if(null==e)return element;if("string"==typeof e)return function(t){return element(t)&&t.tagName===e};if("object"==typeof e)return function(e){let t=[],n=-1;for(;++n-1?t.start:1)+(!1===n.options.incrementListMarker?0:t.children.indexOf(e))+o);let s=o.length+1;("tab"===a||"mixed"===a&&(t&&"list"===t.type&&t.spread||e.spread))&&(s=4*Math.ceil(s/4));let l=n.createTracker(i);l.move(o+" ".repeat(s-o.length)),l.shift(s);let c=n.enter("listItem"),u=n.indentLines(n.containerFlow(e,l.current()),function(e,t,n){return t?(n?"":" ".repeat(s))+e:(n?o:o+" ".repeat(s-o.length))+e});return c(),u}},83132:function(e,t,n){"use strict";n.d(t,{L:function(){return association}});var r=n(47881);function association(e){return e.label||!e.identifier?e.label||"":(0,r.v)(e.identifier)}},64806:function(e,t,n){"use strict";function checkBullet(e){let t=e.options.bullet||"*";if("*"!==t&&"+"!==t&&"-"!==t)throw Error("Cannot serialize items with `"+t+"` for `options.bullet`, expected `*`, `+`, or `-`");return t}n.d(t,{g:function(){return checkBullet}})},77018:function(e,t,n){"use strict";function containerFlow(e,t,n){let r=t.indexStack,i=e.children||[],a=t.createTracker(n),o=[],s=-1;for(r.push(-1);++s\n\n"}return"\n\n"}(n,i[s+1],e,t)))}return r.pop(),o.join("")}n.d(t,{K:function(){return containerFlow}})},87891:function(e,t,n){"use strict";function containerPhrasing(e,t,n){let r=t.indexStack,i=e.children||[],a=[],o=-1,s=n.before;r.push(-1);let l=t.createTracker(n);for(;++o0&&("\r"===s||"\n"===s)&&"html"===u.type&&(a[a.length-1]=a[a.length-1].replace(/(\r?\n|\r)$/," "),s=" ",(l=t.createTracker(n)).move(a.join(""))),a.push(l.move(t.handle(u,e,t,{...l.current(),before:s,after:c}))),s=a[a.length-1].slice(-1)}return r.pop(),a.join("")}n.d(t,{p:function(){return containerPhrasing}})},21665:function(e,t,n){"use strict";n.d(t,{Q:function(){return indentLines}});let r=/\r?\n|\r/g;function indentLines(e,t){let n;let i=[],a=0,o=0;for(;n=r.exec(e);)one(e.slice(a,n.index)),i.push(n[0]),a=n.index+n[0].length,o++;return one(e.slice(a)),i.join("");function one(e){i.push(t(e,o,!e))}}},17466:function(e,t,n){"use strict";function patternCompile(e){if(!e._compiled){let t=(e.atBreak?"[\\r\\n][\\t ]*":"")+(e.before?"(?:"+e.before+")":"");e._compiled=RegExp((t?"("+t+")":"")+(/[|\\{}()[\]^$+*?.-]/.test(e.character)?"\\":"")+e.character+(e.after?"(?:"+e.after+")":""),"g")}return e._compiled}n.d(t,{T:function(){return patternCompile}})},40585:function(e,t,n){"use strict";function patternInScope(e,t){return listInScope(e,t.inConstruct,!0)&&!listInScope(e,t.notInConstruct,!1)}function listInScope(e,t,n){if("string"==typeof t&&(t=[t]),!t||0===t.length)return n;let r=-1;for(;++r=d)&&(!(e+1a?0:a+t:t>a?a:t,n=n>0?n:0,r.length<1e4)(i=Array.from(r)).unshift(t,n),e.splice(...i);else for(n&&e.splice(t,n);o0?(splice(e,e.length,0,t),e):t}n.d(t,{V:function(){return push},d:function(){return splice}})},62987:function(e,t,n){"use strict";n.d(t,{r:function(){return classifyCharacter}});var r=n(75364);function classifyCharacter(e){return null===e||(0,r.z3)(e)||(0,r.B8)(e)?1:(0,r.Xh)(e)?2:void 0}},4663:function(e,t,n){"use strict";n.d(t,{W:function(){return combineExtensions}});var r=n(21905);let i={}.hasOwnProperty;function combineExtensions(e){let t={},n=-1;for(;++n13&&n<32||n>126&&n<160||n>55295&&n<57344||n>64975&&n<65008||(65535&n)==65535||(65535&n)==65534||n>1114111?"�":String.fromCharCode(n)}n.d(t,{o:function(){return decodeNumericCharacterReference}})},47881:function(e,t,n){"use strict";n.d(t,{v:function(){return decodeString}});var r=n(44301),i=n(80889);let a=/\\([!-/:-@[-`{-~])|&(#(?:\d{1,7}|x[\da-f]{1,6})|[\da-z]{1,31});/gi;function decodeString(e){return e.replace(a,decode)}function decode(e,t,n){if(t)return t;let a=n.charCodeAt(0);if(35===a){let e=n.charCodeAt(1),t=120===e||88===e;return(0,i.o)(n.slice(t?2:1),t?16:10)}return(0,r.T)(n)||e}},11098:function(e,t,n){"use strict";function normalizeIdentifier(e){return e.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}n.d(t,{d:function(){return normalizeIdentifier}})},63233:function(e,t,n){"use strict";function resolveAll(e,t,n){let r=[],i=-1;for(;++i"xlink:"+t.slice(5).toLowerCase(),properties:{xLinkActuate:null,xLinkArcRole:null,xLinkHref:null,xLinkRole:null,xLinkShow:null,xLinkTitle:null,xLinkType:null}}),s=create({space:"xml",transform:(e,t)=>"xml:"+t.slice(3).toLowerCase(),properties:{xmlLang:null,xmlBase:null,xmlSpace:null}});function caseSensitiveTransform(e,t){return t in e?e[t]:t}function caseInsensitiveTransform(e,t){return caseSensitiveTransform(e,t.toLowerCase())}let l=create({space:"xmlns",attributes:{xmlnsxlink:"xmlns:xlink"},transform:caseInsensitiveTransform,properties:{xmlns:null,xmlnsXLink:null}});var c=n(47312);let u=create({transform:(e,t)=>"role"===t?t:"aria-"+t.slice(4).toLowerCase(),properties:{ariaActiveDescendant:null,ariaAtomic:c.booleanish,ariaAutoComplete:null,ariaBusy:c.booleanish,ariaChecked:c.booleanish,ariaColCount:c.number,ariaColIndex:c.number,ariaColSpan:c.number,ariaControls:c.spaceSeparated,ariaCurrent:null,ariaDescribedBy:c.spaceSeparated,ariaDetails:null,ariaDisabled:c.booleanish,ariaDropEffect:c.spaceSeparated,ariaErrorMessage:null,ariaExpanded:c.booleanish,ariaFlowTo:c.spaceSeparated,ariaGrabbed:c.booleanish,ariaHasPopup:null,ariaHidden:c.booleanish,ariaInvalid:null,ariaKeyShortcuts:null,ariaLabel:null,ariaLabelledBy:c.spaceSeparated,ariaLevel:c.number,ariaLive:null,ariaModal:c.booleanish,ariaMultiLine:c.booleanish,ariaMultiSelectable:c.booleanish,ariaOrientation:null,ariaOwns:c.spaceSeparated,ariaPlaceholder:null,ariaPosInSet:c.number,ariaPressed:c.booleanish,ariaReadOnly:c.booleanish,ariaRelevant:null,ariaRequired:c.booleanish,ariaRoleDescription:c.spaceSeparated,ariaRowCount:c.number,ariaRowIndex:c.number,ariaRowSpan:c.number,ariaSelected:c.booleanish,ariaSetSize:c.number,ariaSort:null,ariaValueMax:c.number,ariaValueMin:c.number,ariaValueNow:c.number,ariaValueText:null,role:null}}),d=create({space:"html",attributes:{acceptcharset:"accept-charset",classname:"class",htmlfor:"for",httpequiv:"http-equiv"},transform:caseInsensitiveTransform,mustUseProperty:["checked","multiple","muted","selected"],properties:{abbr:null,accept:c.commaSeparated,acceptCharset:c.spaceSeparated,accessKey:c.spaceSeparated,action:null,allow:null,allowFullScreen:c.boolean,allowPaymentRequest:c.boolean,allowUserMedia:c.boolean,alt:null,as:null,async:c.boolean,autoCapitalize:null,autoComplete:c.spaceSeparated,autoFocus:c.boolean,autoPlay:c.boolean,blocking:c.spaceSeparated,capture:null,charSet:null,checked:c.boolean,cite:null,className:c.spaceSeparated,cols:c.number,colSpan:null,content:null,contentEditable:c.booleanish,controls:c.boolean,controlsList:c.spaceSeparated,coords:c.number|c.commaSeparated,crossOrigin:null,data:null,dateTime:null,decoding:null,default:c.boolean,defer:c.boolean,dir:null,dirName:null,disabled:c.boolean,download:c.overloadedBoolean,draggable:c.booleanish,encType:null,enterKeyHint:null,fetchPriority:null,form:null,formAction:null,formEncType:null,formMethod:null,formNoValidate:c.boolean,formTarget:null,headers:c.spaceSeparated,height:c.number,hidden:c.boolean,high:c.number,href:null,hrefLang:null,htmlFor:c.spaceSeparated,httpEquiv:c.spaceSeparated,id:null,imageSizes:null,imageSrcSet:null,inert:c.boolean,inputMode:null,integrity:null,is:null,isMap:c.boolean,itemId:null,itemProp:c.spaceSeparated,itemRef:c.spaceSeparated,itemScope:c.boolean,itemType:c.spaceSeparated,kind:null,label:null,lang:null,language:null,list:null,loading:null,loop:c.boolean,low:c.number,manifest:null,max:null,maxLength:c.number,media:null,method:null,min:null,minLength:c.number,multiple:c.boolean,muted:c.boolean,name:null,nonce:null,noModule:c.boolean,noValidate:c.boolean,onAbort:null,onAfterPrint:null,onAuxClick:null,onBeforeMatch:null,onBeforePrint:null,onBeforeToggle:null,onBeforeUnload:null,onBlur:null,onCancel:null,onCanPlay:null,onCanPlayThrough:null,onChange:null,onClick:null,onClose:null,onContextLost:null,onContextMenu:null,onContextRestored:null,onCopy:null,onCueChange:null,onCut:null,onDblClick:null,onDrag:null,onDragEnd:null,onDragEnter:null,onDragExit:null,onDragLeave:null,onDragOver:null,onDragStart:null,onDrop:null,onDurationChange:null,onEmptied:null,onEnded:null,onError:null,onFocus:null,onFormData:null,onHashChange:null,onInput:null,onInvalid:null,onKeyDown:null,onKeyPress:null,onKeyUp:null,onLanguageChange:null,onLoad:null,onLoadedData:null,onLoadedMetadata:null,onLoadEnd:null,onLoadStart:null,onMessage:null,onMessageError:null,onMouseDown:null,onMouseEnter:null,onMouseLeave:null,onMouseMove:null,onMouseOut:null,onMouseOver:null,onMouseUp:null,onOffline:null,onOnline:null,onPageHide:null,onPageShow:null,onPaste:null,onPause:null,onPlay:null,onPlaying:null,onPopState:null,onProgress:null,onRateChange:null,onRejectionHandled:null,onReset:null,onResize:null,onScroll:null,onScrollEnd:null,onSecurityPolicyViolation:null,onSeeked:null,onSeeking:null,onSelect:null,onSlotChange:null,onStalled:null,onStorage:null,onSubmit:null,onSuspend:null,onTimeUpdate:null,onToggle:null,onUnhandledRejection:null,onUnload:null,onVolumeChange:null,onWaiting:null,onWheel:null,open:c.boolean,optimum:c.number,pattern:null,ping:c.spaceSeparated,placeholder:null,playsInline:c.boolean,popover:null,popoverTarget:null,popoverTargetAction:null,poster:null,preload:null,readOnly:c.boolean,referrerPolicy:null,rel:c.spaceSeparated,required:c.boolean,reversed:c.boolean,rows:c.number,rowSpan:c.number,sandbox:c.spaceSeparated,scope:null,scoped:c.boolean,seamless:c.boolean,selected:c.boolean,shadowRootClonable:c.boolean,shadowRootDelegatesFocus:c.boolean,shadowRootMode:null,shape:null,size:c.number,sizes:null,slot:null,span:c.number,spellCheck:c.booleanish,src:null,srcDoc:null,srcLang:null,srcSet:null,start:c.number,step:null,style:null,tabIndex:c.number,target:null,title:null,translate:null,type:null,typeMustMatch:c.boolean,useMap:null,value:c.booleanish,width:c.number,wrap:null,writingSuggestions:null,align:null,aLink:null,archive:c.spaceSeparated,axis:null,background:null,bgColor:null,border:c.number,borderColor:null,bottomMargin:c.number,cellPadding:null,cellSpacing:null,char:null,charOff:null,classId:null,clear:null,code:null,codeBase:null,codeType:null,color:null,compact:c.boolean,declare:c.boolean,event:null,face:null,frame:null,frameBorder:null,hSpace:c.number,leftMargin:c.number,link:null,longDesc:null,lowSrc:null,marginHeight:c.number,marginWidth:c.number,noResize:c.boolean,noHref:c.boolean,noShade:c.boolean,noWrap:c.boolean,object:null,profile:null,prompt:null,rev:null,rightMargin:c.number,rules:null,scheme:null,scrolling:c.booleanish,standby:null,summary:null,text:null,topMargin:c.number,valueType:null,version:null,vAlign:null,vLink:null,vSpace:c.number,allowTransparency:null,autoCorrect:null,autoSave:null,disablePictureInPicture:c.boolean,disableRemotePlayback:c.boolean,prefix:null,property:null,results:c.number,security:null,unselectable:null}}),p=create({space:"svg",attributes:{accentHeight:"accent-height",alignmentBaseline:"alignment-baseline",arabicForm:"arabic-form",baselineShift:"baseline-shift",capHeight:"cap-height",className:"class",clipPath:"clip-path",clipRule:"clip-rule",colorInterpolation:"color-interpolation",colorInterpolationFilters:"color-interpolation-filters",colorProfile:"color-profile",colorRendering:"color-rendering",crossOrigin:"crossorigin",dataType:"datatype",dominantBaseline:"dominant-baseline",enableBackground:"enable-background",fillOpacity:"fill-opacity",fillRule:"fill-rule",floodColor:"flood-color",floodOpacity:"flood-opacity",fontFamily:"font-family",fontSize:"font-size",fontSizeAdjust:"font-size-adjust",fontStretch:"font-stretch",fontStyle:"font-style",fontVariant:"font-variant",fontWeight:"font-weight",glyphName:"glyph-name",glyphOrientationHorizontal:"glyph-orientation-horizontal",glyphOrientationVertical:"glyph-orientation-vertical",hrefLang:"hreflang",horizAdvX:"horiz-adv-x",horizOriginX:"horiz-origin-x",horizOriginY:"horiz-origin-y",imageRendering:"image-rendering",letterSpacing:"letter-spacing",lightingColor:"lighting-color",markerEnd:"marker-end",markerMid:"marker-mid",markerStart:"marker-start",navDown:"nav-down",navDownLeft:"nav-down-left",navDownRight:"nav-down-right",navLeft:"nav-left",navNext:"nav-next",navPrev:"nav-prev",navRight:"nav-right",navUp:"nav-up",navUpLeft:"nav-up-left",navUpRight:"nav-up-right",onAbort:"onabort",onActivate:"onactivate",onAfterPrint:"onafterprint",onBeforePrint:"onbeforeprint",onBegin:"onbegin",onCancel:"oncancel",onCanPlay:"oncanplay",onCanPlayThrough:"oncanplaythrough",onChange:"onchange",onClick:"onclick",onClose:"onclose",onCopy:"oncopy",onCueChange:"oncuechange",onCut:"oncut",onDblClick:"ondblclick",onDrag:"ondrag",onDragEnd:"ondragend",onDragEnter:"ondragenter",onDragExit:"ondragexit",onDragLeave:"ondragleave",onDragOver:"ondragover",onDragStart:"ondragstart",onDrop:"ondrop",onDurationChange:"ondurationchange",onEmptied:"onemptied",onEnd:"onend",onEnded:"onended",onError:"onerror",onFocus:"onfocus",onFocusIn:"onfocusin",onFocusOut:"onfocusout",onHashChange:"onhashchange",onInput:"oninput",onInvalid:"oninvalid",onKeyDown:"onkeydown",onKeyPress:"onkeypress",onKeyUp:"onkeyup",onLoad:"onload",onLoadedData:"onloadeddata",onLoadedMetadata:"onloadedmetadata",onLoadStart:"onloadstart",onMessage:"onmessage",onMouseDown:"onmousedown",onMouseEnter:"onmouseenter",onMouseLeave:"onmouseleave",onMouseMove:"onmousemove",onMouseOut:"onmouseout",onMouseOver:"onmouseover",onMouseUp:"onmouseup",onMouseWheel:"onmousewheel",onOffline:"onoffline",onOnline:"ononline",onPageHide:"onpagehide",onPageShow:"onpageshow",onPaste:"onpaste",onPause:"onpause",onPlay:"onplay",onPlaying:"onplaying",onPopState:"onpopstate",onProgress:"onprogress",onRateChange:"onratechange",onRepeat:"onrepeat",onReset:"onreset",onResize:"onresize",onScroll:"onscroll",onSeeked:"onseeked",onSeeking:"onseeking",onSelect:"onselect",onShow:"onshow",onStalled:"onstalled",onStorage:"onstorage",onSubmit:"onsubmit",onSuspend:"onsuspend",onTimeUpdate:"ontimeupdate",onToggle:"ontoggle",onUnload:"onunload",onVolumeChange:"onvolumechange",onWaiting:"onwaiting",onZoom:"onzoom",overlinePosition:"overline-position",overlineThickness:"overline-thickness",paintOrder:"paint-order",panose1:"panose-1",pointerEvents:"pointer-events",referrerPolicy:"referrerpolicy",renderingIntent:"rendering-intent",shapeRendering:"shape-rendering",stopColor:"stop-color",stopOpacity:"stop-opacity",strikethroughPosition:"strikethrough-position",strikethroughThickness:"strikethrough-thickness",strokeDashArray:"stroke-dasharray",strokeDashOffset:"stroke-dashoffset",strokeLineCap:"stroke-linecap",strokeLineJoin:"stroke-linejoin",strokeMiterLimit:"stroke-miterlimit",strokeOpacity:"stroke-opacity",strokeWidth:"stroke-width",tabIndex:"tabindex",textAnchor:"text-anchor",textDecoration:"text-decoration",textRendering:"text-rendering",transformOrigin:"transform-origin",typeOf:"typeof",underlinePosition:"underline-position",underlineThickness:"underline-thickness",unicodeBidi:"unicode-bidi",unicodeRange:"unicode-range",unitsPerEm:"units-per-em",vAlphabetic:"v-alphabetic",vHanging:"v-hanging",vIdeographic:"v-ideographic",vMathematical:"v-mathematical",vectorEffect:"vector-effect",vertAdvY:"vert-adv-y",vertOriginX:"vert-origin-x",vertOriginY:"vert-origin-y",wordSpacing:"word-spacing",writingMode:"writing-mode",xHeight:"x-height",playbackOrder:"playbackorder",timelineBegin:"timelinebegin"},transform:caseSensitiveTransform,properties:{about:c.commaOrSpaceSeparated,accentHeight:c.number,accumulate:null,additive:null,alignmentBaseline:null,alphabetic:c.number,amplitude:c.number,arabicForm:null,ascent:c.number,attributeName:null,attributeType:null,azimuth:c.number,bandwidth:null,baselineShift:null,baseFrequency:null,baseProfile:null,bbox:null,begin:null,bias:c.number,by:null,calcMode:null,capHeight:c.number,className:c.spaceSeparated,clip:null,clipPath:null,clipPathUnits:null,clipRule:null,color:null,colorInterpolation:null,colorInterpolationFilters:null,colorProfile:null,colorRendering:null,content:null,contentScriptType:null,contentStyleType:null,crossOrigin:null,cursor:null,cx:null,cy:null,d:null,dataType:null,defaultAction:null,descent:c.number,diffuseConstant:c.number,direction:null,display:null,dur:null,divisor:c.number,dominantBaseline:null,download:c.boolean,dx:null,dy:null,edgeMode:null,editable:null,elevation:c.number,enableBackground:null,end:null,event:null,exponent:c.number,externalResourcesRequired:null,fill:null,fillOpacity:c.number,fillRule:null,filter:null,filterRes:null,filterUnits:null,floodColor:null,floodOpacity:null,focusable:null,focusHighlight:null,fontFamily:null,fontSize:null,fontSizeAdjust:null,fontStretch:null,fontStyle:null,fontVariant:null,fontWeight:null,format:null,fr:null,from:null,fx:null,fy:null,g1:c.commaSeparated,g2:c.commaSeparated,glyphName:c.commaSeparated,glyphOrientationHorizontal:null,glyphOrientationVertical:null,glyphRef:null,gradientTransform:null,gradientUnits:null,handler:null,hanging:c.number,hatchContentUnits:null,hatchUnits:null,height:null,href:null,hrefLang:null,horizAdvX:c.number,horizOriginX:c.number,horizOriginY:c.number,id:null,ideographic:c.number,imageRendering:null,initialVisibility:null,in:null,in2:null,intercept:c.number,k:c.number,k1:c.number,k2:c.number,k3:c.number,k4:c.number,kernelMatrix:c.commaOrSpaceSeparated,kernelUnitLength:null,keyPoints:null,keySplines:null,keyTimes:null,kerning:null,lang:null,lengthAdjust:null,letterSpacing:null,lightingColor:null,limitingConeAngle:c.number,local:null,markerEnd:null,markerMid:null,markerStart:null,markerHeight:null,markerUnits:null,markerWidth:null,mask:null,maskContentUnits:null,maskUnits:null,mathematical:null,max:null,media:null,mediaCharacterEncoding:null,mediaContentEncodings:null,mediaSize:c.number,mediaTime:null,method:null,min:null,mode:null,name:null,navDown:null,navDownLeft:null,navDownRight:null,navLeft:null,navNext:null,navPrev:null,navRight:null,navUp:null,navUpLeft:null,navUpRight:null,numOctaves:null,observer:null,offset:null,onAbort:null,onActivate:null,onAfterPrint:null,onBeforePrint:null,onBegin:null,onCancel:null,onCanPlay:null,onCanPlayThrough:null,onChange:null,onClick:null,onClose:null,onCopy:null,onCueChange:null,onCut:null,onDblClick:null,onDrag:null,onDragEnd:null,onDragEnter:null,onDragExit:null,onDragLeave:null,onDragOver:null,onDragStart:null,onDrop:null,onDurationChange:null,onEmptied:null,onEnd:null,onEnded:null,onError:null,onFocus:null,onFocusIn:null,onFocusOut:null,onHashChange:null,onInput:null,onInvalid:null,onKeyDown:null,onKeyPress:null,onKeyUp:null,onLoad:null,onLoadedData:null,onLoadedMetadata:null,onLoadStart:null,onMessage:null,onMouseDown:null,onMouseEnter:null,onMouseLeave:null,onMouseMove:null,onMouseOut:null,onMouseOver:null,onMouseUp:null,onMouseWheel:null,onOffline:null,onOnline:null,onPageHide:null,onPageShow:null,onPaste:null,onPause:null,onPlay:null,onPlaying:null,onPopState:null,onProgress:null,onRateChange:null,onRepeat:null,onReset:null,onResize:null,onScroll:null,onSeeked:null,onSeeking:null,onSelect:null,onShow:null,onStalled:null,onStorage:null,onSubmit:null,onSuspend:null,onTimeUpdate:null,onToggle:null,onUnload:null,onVolumeChange:null,onWaiting:null,onZoom:null,opacity:null,operator:null,order:null,orient:null,orientation:null,origin:null,overflow:null,overlay:null,overlinePosition:c.number,overlineThickness:c.number,paintOrder:null,panose1:null,path:null,pathLength:c.number,patternContentUnits:null,patternTransform:null,patternUnits:null,phase:null,ping:c.spaceSeparated,pitch:null,playbackOrder:null,pointerEvents:null,points:null,pointsAtX:c.number,pointsAtY:c.number,pointsAtZ:c.number,preserveAlpha:null,preserveAspectRatio:null,primitiveUnits:null,propagate:null,property:c.commaOrSpaceSeparated,r:null,radius:null,referrerPolicy:null,refX:null,refY:null,rel:c.commaOrSpaceSeparated,rev:c.commaOrSpaceSeparated,renderingIntent:null,repeatCount:null,repeatDur:null,requiredExtensions:c.commaOrSpaceSeparated,requiredFeatures:c.commaOrSpaceSeparated,requiredFonts:c.commaOrSpaceSeparated,requiredFormats:c.commaOrSpaceSeparated,resource:null,restart:null,result:null,rotate:null,rx:null,ry:null,scale:null,seed:null,shapeRendering:null,side:null,slope:null,snapshotTime:null,specularConstant:c.number,specularExponent:c.number,spreadMethod:null,spacing:null,startOffset:null,stdDeviation:null,stemh:null,stemv:null,stitchTiles:null,stopColor:null,stopOpacity:null,strikethroughPosition:c.number,strikethroughThickness:c.number,string:null,stroke:null,strokeDashArray:c.commaOrSpaceSeparated,strokeDashOffset:null,strokeLineCap:null,strokeLineJoin:null,strokeMiterLimit:c.number,strokeOpacity:c.number,strokeWidth:null,style:null,surfaceScale:c.number,syncBehavior:null,syncBehaviorDefault:null,syncMaster:null,syncTolerance:null,syncToleranceDefault:null,systemLanguage:c.commaOrSpaceSeparated,tabIndex:c.number,tableValues:null,target:null,targetX:c.number,targetY:c.number,textAnchor:null,textDecoration:null,textRendering:null,textLength:null,timelineBegin:null,title:null,transformBehavior:null,type:null,typeOf:c.commaOrSpaceSeparated,to:null,transform:null,transformOrigin:null,u1:null,u2:null,underlinePosition:c.number,underlineThickness:c.number,unicode:null,unicodeBidi:null,unicodeRange:null,unitsPerEm:c.number,values:null,vAlphabetic:c.number,vMathematical:c.number,vectorEffect:null,vHanging:c.number,vIdeographic:c.number,version:null,vertAdvY:c.number,vertOriginX:c.number,vertOriginY:c.number,viewBox:null,viewTarget:null,visibility:null,width:null,widths:null,wordSpacing:null,writingMode:null,x:null,x1:null,x2:null,xChannelSelector:null,xHeight:c.number,y:null,y1:null,y2:null,yChannelSelector:null,z:null,zoomAndPan:null}}),f=merge([s,o,l,u,d],"html"),m=merge([s,o,l,u,p],"svg")},26103:function(e,t,n){"use strict";n.d(t,{s:function(){return find}});var r=n(93859),i=n(75729),a=n(49255);let o=/^data[-\w.:]+$/i,s=/-[a-z]/g,l=/[A-Z]/g;function find(e,t){let n=(0,r.F)(t),c=t,u=a.k;if(n in e.normal)return e.property[e.normal[n]];if(n.length>4&&"data"===n.slice(0,4)&&o.test(t)){if("-"===t.charAt(4)){let e=t.slice(5).replace(s,camelcase);c="data"+e.charAt(0).toUpperCase()+e.slice(1)}else{let e=t.slice(4);if(!s.test(e)){let n=e.replace(l,kebab);"-"!==n.charAt(0)&&(n="-"+n),t="data"+n}}u=i.I}return new u(c,t)}function kebab(e){return"-"+e.toLowerCase()}function camelcase(e){return e.charAt(1).toUpperCase()}},93859:function(e,t,n){"use strict";function normalize(e){return e.toLowerCase()}n.d(t,{F:function(){return normalize}})},75729:function(e,t,n){"use strict";n.d(t,{I:function(){return DefinedInfo}});var r=n(49255),i=n(47312);let a=Object.keys(i);let DefinedInfo=class DefinedInfo extends r.k{constructor(e,t,n,r){var o,s;let l=-1;if(super(e,t),r&&(this.space=r),"number"==typeof n)for(;++l{(0,s.Vn)(e,"element",(e,n,r)=>{if((0,a.B)(e)&&(0,i.l)(e,"id")&&f(e,n,r))return t(e,n,r)})};function toChildren(e,t){let n=toNode(e,t);return Array.isArray(n)?n:[n]}function toNode(e,t){return"function"==typeof e?e(t):r(!0,Array.isArray(e)?[]:{},e)}function create(e,t,n){return{type:"element",tagName:"a",properties:Object.assign({},t,{href:"#"+(e.properties||{}).id}),children:n}}}},86073:function(e,t,n){"use strict";n.d(t,{Z:function(){return rehypeHighlight}});let MODES=e=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z][A-Za-z0-9_-]*/}}),r=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],i=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],a=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],s=["align-content","align-items","align-self","all","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","content","content-visibility","counter-increment","counter-reset","cue","cue-after","cue-before","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-synthesis","font-variant","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","gap","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inline-size","isolation","justify-content","left","letter-spacing","line-break","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","pause","pause-after","pause-before","perspective","perspective-origin","pointer-events","position","quotes","resize","rest","rest-after","rest-before","right","row-gap","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","speak","speak-as","src","tab-size","table-layout","text-align","text-align-all","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-box","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","z-index"].reverse();var l="[0-9](_*[0-9])*",c=`\\.(${l})`,u="[0-9a-fA-F](_*[0-9a-fA-F])*",d={className:"number",variants:[{begin:`(\\b(${l})((${c})|\\.)?|(${c}))[eE][+-]?(${l})[fFdD]?\\b`},{begin:`\\b(${l})((${c})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{begin:`(${c})[fFdD]?\\b`},{begin:`\\b(${l})[fFdD]\\b`},{begin:`\\b0[xX]((${u})\\.?|(${u})?\\.(${u}))[pP][+-]?(${l})[fFdD]?\\b`},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${u})[lL]?\\b`},{begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}],relevance:0};let p="[A-Za-z$_][0-9A-Za-z$_]*",f=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],m=["true","false","null","undefined","NaN","Infinity"],g=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],E=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],b=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],T=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],_=[].concat(b,g,E);var A="[0-9](_*[0-9])*",C=`\\.(${A})`,y="[0-9a-fA-F](_*[0-9a-fA-F])*",k={className:"number",variants:[{begin:`(\\b(${A})((${C})|\\.)?|(${C}))[eE][+-]?(${A})[fFdD]?\\b`},{begin:`\\b(${A})((${C})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{begin:`(${C})[fFdD]?\\b`},{begin:`\\b(${A})[fFdD]\\b`},{begin:`\\b0[xX]((${y})\\.?|(${y})?\\.(${y}))[pP][+-]?(${A})[fFdD]?\\b`},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${y})[lL]?\\b`},{begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}],relevance:0};let less_MODES=e=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z][A-Za-z0-9_-]*/}}),N=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],S=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],D=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],x=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],O=["align-content","align-items","align-self","all","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","content","content-visibility","counter-increment","counter-reset","cue","cue-after","cue-before","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-synthesis","font-variant","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","gap","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inline-size","isolation","justify-content","left","letter-spacing","line-break","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","pause","pause-after","pause-before","perspective","perspective-origin","pointer-events","position","quotes","resize","rest","rest-after","rest-before","right","row-gap","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","speak","speak-as","src","tab-size","table-layout","text-align","text-align-all","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-box","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","z-index"].reverse(),v=D.concat(x),scss_MODES=e=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z][A-Za-z0-9_-]*/}}),I=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],w=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],R=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],F=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],M=["align-content","align-items","align-self","all","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","content","content-visibility","counter-increment","counter-reset","cue","cue-after","cue-before","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-synthesis","font-variant","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","gap","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inline-size","isolation","justify-content","left","letter-spacing","line-break","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","pause","pause-after","pause-before","perspective","perspective-origin","pointer-events","position","quotes","resize","rest","rest-after","rest-before","right","row-gap","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","speak","speak-as","src","tab-size","table-layout","text-align","text-align-all","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-box","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","z-index"].reverse();function source(e){return e?"string"==typeof e?e:e.source:null}function lookahead(e){return concat("(?=",e,")")}function concat(...e){let t=e.map(e=>source(e)).join("");return t}function either(...e){let t=function(e){let t=e[e.length-1];return"object"==typeof t&&t.constructor===Object?(e.splice(e.length-1,1),t):{}}(e),n="("+(t.capture?"":"?:")+e.map(e=>source(e)).join("|")+")";return n}let keywordWrapper=e=>concat(/\b/,e,/\w$/.test(e)?/\b/:/\B/),L=["Protocol","Type"].map(keywordWrapper),B=["init","self"].map(keywordWrapper),P=["Any","Self"],H=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","break","case","catch","class","continue","convenience","default","defer","deinit","didSet","distributed","do","dynamic","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],U=["false","nil","true"],z=["assignment","associativity","higherThan","left","lowerThan","none","right"],G=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warn_unqualified_access","#warning"],K=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],j=either(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),q=either(j,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),$=concat(j,q,"*"),W=either(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),V=either(W,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),Q=concat(W,V,"*"),Y=concat(/[A-Z]/,V,"*"),Z=["autoclosure",concat(/convention\(/,either("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",concat(/objc\(/,Q,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","testable","UIApplicationMain","unknown","usableFromInline"],X=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"],J="[A-Za-z$_][0-9A-Za-z$_]*",ee=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],et=["true","false","null","undefined","NaN","Infinity"],en=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],er=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],ei=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],ea=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],eo=[].concat(ei,en,er);var es=n(85554),el=n(46291);let ec=Object.assign(create(Error),{eval:create(EvalError),range:create(RangeError),reference:create(ReferenceError),syntax:create(SyntaxError),type:create(TypeError),uri:create(URIError)});function create(e){return FormattedError.displayName=e.displayName||e.name,FormattedError;function FormattedError(t,...n){let r=t?el(t,...n):t;return new e(r)}}let eu={}.hasOwnProperty,ed="hljs-";function highlight(e,t,n={}){let r=n.prefix;if("string"!=typeof e)throw ec("Expected `string` for name, got `%s`",e);if(!es.getLanguage(e))throw ec("Unknown language: `%s` is not registered",e);if("string"!=typeof t)throw ec("Expected `string` for value, got `%s`",t);null==r&&(r=ed),es.configure({__emitter:HastEmitter,classPrefix:r});let i=es.highlight(t,{language:e,ignoreIllegals:!0});if(es.configure({}),i.errorRaised)throw i.errorRaised;return i._emitter.root.data.language=i.language,i._emitter.root.data.relevance=i.relevance,i._emitter.root}let HastEmitter=class HastEmitter{constructor(e){this.options=e,this.root={type:"root",data:{language:null,relevance:0},children:[]},this.stack=[this.root]}addText(e){if(""===e)return;let t=this.stack[this.stack.length-1],n=t.children[t.children.length-1];n&&"text"===n.type?n.value+=e:t.children.push({type:"text",value:e})}startScope(e){this.openNode(String(e))}endScope(){this.closeNode()}__addSublanguage(e,t){let n=this.stack[this.stack.length-1],r=e.root.children;t?n.children.push({type:"element",tagName:"span",properties:{className:[t]},children:r}):n.children.push(...r)}openNode(e){let t=e.split(".").map((e,t)=>t?e+"_".repeat(t):this.options.classPrefix+e),n=this.stack[this.stack.length-1],r={type:"element",tagName:"span",properties:{className:t},children:[]};n.children.push(r),this.stack.push(r)}closeNode(){this.stack.pop()}finalize(){}toHTML(){return""}};let ep={highlight,highlightAuto:function(e,t={}){let n=t.subset||es.listLanguages(),r=t.prefix,i=-1,a={type:"root",data:{language:null,relevance:0},children:[]};if(null==r&&(r=ed),"string"!=typeof e)throw ec("Expected `string` for value, got `%s`",e);for(;++ia.data.relevance&&(a=o)}return a},registerLanguage:function(e,t){es.registerLanguage(e,t)},registered:function(e){return!!es.getLanguage(e)},listLanguages:function(){return es.listLanguages()},registerAlias:function(e,t){if("string"==typeof e)es.registerAliases(t,{languageName:e});else{let t;for(t in e)eu.call(e,t)&&es.registerAliases(e[t],{languageName:t})}}};ep.registerLanguage("arduino",function(e){let t={type:["boolean","byte","word","String"],built_in:["KeyboardController","MouseController","SoftwareSerial","EthernetServer","EthernetClient","LiquidCrystal","RobotControl","GSMVoiceCall","EthernetUDP","EsploraTFT","HttpClient","RobotMotor","WiFiClient","GSMScanner","FileSystem","Scheduler","GSMServer","YunClient","YunServer","IPAddress","GSMClient","GSMModem","Keyboard","Ethernet","Console","GSMBand","Esplora","Stepper","Process","WiFiUDP","GSM_SMS","Mailbox","USBHost","Firmata","PImage","Client","Server","GSMPIN","FileIO","Bridge","Serial","EEPROM","Stream","Mouse","Audio","Servo","File","Task","GPRS","WiFi","Wire","TFT","GSM","SPI","SD"],_hints:["setup","loop","runShellCommandAsynchronously","analogWriteResolution","retrieveCallingNumber","printFirmwareVersion","analogReadResolution","sendDigitalPortPair","noListenOnLocalhost","readJoystickButton","setFirmwareVersion","readJoystickSwitch","scrollDisplayRight","getVoiceCallStatus","scrollDisplayLeft","writeMicroseconds","delayMicroseconds","beginTransmission","getSignalStrength","runAsynchronously","getAsynchronously","listenOnLocalhost","getCurrentCarrier","readAccelerometer","messageAvailable","sendDigitalPorts","lineFollowConfig","countryNameWrite","runShellCommand","readStringUntil","rewindDirectory","readTemperature","setClockDivider","readLightSensor","endTransmission","analogReference","detachInterrupt","countryNameRead","attachInterrupt","encryptionType","readBytesUntil","robotNameWrite","readMicrophone","robotNameRead","cityNameWrite","userNameWrite","readJoystickY","readJoystickX","mouseReleased","openNextFile","scanNetworks","noInterrupts","digitalWrite","beginSpeaker","mousePressed","isActionDone","mouseDragged","displayLogos","noAutoscroll","addParameter","remoteNumber","getModifiers","keyboardRead","userNameRead","waitContinue","processInput","parseCommand","printVersion","readNetworks","writeMessage","blinkVersion","cityNameRead","readMessage","setDataMode","parsePacket","isListening","setBitOrder","beginPacket","isDirectory","motorsWrite","drawCompass","digitalRead","clearScreen","serialEvent","rightToLeft","setTextSize","leftToRight","requestFrom","keyReleased","compassRead","analogWrite","interrupts","WiFiServer","disconnect","playMelody","parseFloat","autoscroll","getPINUsed","setPINUsed","setTimeout","sendAnalog","readSlider","analogRead","beginWrite","createChar","motorsStop","keyPressed","tempoWrite","readButton","subnetMask","debugPrint","macAddress","writeGreen","randomSeed","attachGPRS","readString","sendString","remotePort","releaseAll","mouseMoved","background","getXChange","getYChange","answerCall","getResult","voiceCall","endPacket","constrain","getSocket","writeJSON","getButton","available","connected","findUntil","readBytes","exitValue","readGreen","writeBlue","startLoop","IPAddress","isPressed","sendSysex","pauseMode","gatewayIP","setCursor","getOemKey","tuneWrite","noDisplay","loadImage","switchPIN","onRequest","onReceive","changePIN","playFile","noBuffer","parseInt","overflow","checkPIN","knobRead","beginTFT","bitClear","updateIR","bitWrite","position","writeRGB","highByte","writeRed","setSpeed","readBlue","noStroke","remoteIP","transfer","shutdown","hangCall","beginSMS","endWrite","attached","maintain","noCursor","checkReg","checkPUK","shiftOut","isValid","shiftIn","pulseIn","connect","println","localIP","pinMode","getIMEI","display","noBlink","process","getBand","running","beginSD","drawBMP","lowByte","setBand","release","bitRead","prepare","pointTo","readRed","setMode","noFill","remove","listen","stroke","detach","attach","noTone","exists","buffer","height","bitSet","circle","config","cursor","random","IRread","setDNS","endSMS","getKey","micros","millis","begin","print","write","ready","flush","width","isPIN","blink","clear","press","mkdir","rmdir","close","point","yield","image","BSSID","click","delay","read","text","move","peek","beep","rect","line","open","seek","fill","size","turn","stop","home","find","step","tone","sqrt","RSSI","SSID","end","bit","tan","cos","sin","pow","map","abs","max","min","get","run","put"],literal:["DIGITAL_MESSAGE","FIRMATA_STRING","ANALOG_MESSAGE","REPORT_DIGITAL","REPORT_ANALOG","INPUT_PULLUP","SET_PIN_MODE","INTERNAL2V56","SYSTEM_RESET","LED_BUILTIN","INTERNAL1V1","SYSEX_START","INTERNAL","EXTERNAL","DEFAULT","OUTPUT","INPUT","HIGH","LOW"]},n=function(e){let t=e.regex,n=e.COMMENT("//","$",{contains:[{begin:/\\\n/}]}),r="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",a="(?!struct)("+r+"|"+t.optional(i)+"[a-zA-Z_]\\w*"+t.optional("<[^<>]+>")+")",o={className:"type",begin:"\\b[a-z\\d_]*_t\\b"},s={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},l={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(s,{className:"string"}),{className:"string",begin:/<.*?>/},n,e.C_BLOCK_COMMENT_MODE]},u={className:"title",begin:t.optional(i)+e.IDENT_RE,relevance:0},d=t.optional(i)+e.IDENT_RE+"\\s*\\(",p={type:["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"],keyword:["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"],literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"],_type_hints:["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"]},f={className:"function.dispatch",relevance:0,keywords:{_hint:["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"]},begin:t.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,t.lookahead(/(<[^<>]+>|)\s*\(/))},m=[f,c,o,n,e.C_BLOCK_COMMENT_MODE,l,s],g={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:p,contains:m.concat([{begin:/\(/,end:/\)/,keywords:p,contains:m.concat(["self"]),relevance:0}]),relevance:0},E={className:"function",begin:"("+a+"[\\*&\\s]+)+"+d,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:p,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:r,keywords:p,relevance:0},{begin:d,returnBegin:!0,contains:[u],relevance:0},{begin:/::/,relevance:0},{begin:/:/,endsWithParent:!0,contains:[s,l]},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:p,relevance:0,contains:[n,e.C_BLOCK_COMMENT_MODE,s,l,o,{begin:/\(/,end:/\)/,keywords:p,relevance:0,contains:["self",n,e.C_BLOCK_COMMENT_MODE,s,l,o]}]},o,n,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C++",aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:p,illegal:"",keywords:p,contains:["self",o]},{begin:e.IDENT_RE+"::",keywords:p},{match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/],className:{1:"keyword",3:"title.class"}}])}}(e),r=n.keywords;return r.type=[...r.type,...t.type],r.literal=[...r.literal,...t.literal],r.built_in=[...r.built_in,...t.built_in],r._hints=t._hints,n.name="Arduino",n.aliases=["ino"],n.supersetOf="cpp",n}),ep.registerLanguage("bash",function(e){let t=e.regex,n={};Object.assign(n,{className:"variable",variants:[{begin:t.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},{begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[n]}]}]});let r={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},i={begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},a={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,n,r]};r.contains.push(a);let o={begin:/\$?\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,n]},s=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10}),l={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/,keyword:["if","then","else","elif","fi","for","while","until","in","do","done","case","esac","function","select"],literal:["true","false"],built_in:["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset","alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","type","typeset","ulimit","unalias","set","shopt","autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp","chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"]},contains:[s,e.SHEBANG(),l,o,e.HASH_COMMENT_MODE,i,{match:/(\/[a-z._-]+)+/},a,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},n]}}),ep.registerLanguage("c",function(e){let t=e.regex,n=e.COMMENT("//","$",{contains:[{begin:/\\\n/}]}),r="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",a="("+r+"|"+t.optional(i)+"[a-zA-Z_]\\w*"+t.optional("<[^<>]+>")+")",o={className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{match:/\batomic_[a-z]{3,6}\b/}]},s={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},l={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(s,{className:"string"}),{className:"string",begin:/<.*?>/},n,e.C_BLOCK_COMMENT_MODE]},u={className:"title",begin:t.optional(i)+e.IDENT_RE,relevance:0},d=t.optional(i)+e.IDENT_RE+"\\s*\\(",p={keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"],type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal128","const","static","complex","bool","imaginary"],literal:"true false NULL",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr"},f=[c,o,n,e.C_BLOCK_COMMENT_MODE,l,s],m={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:p,contains:f.concat([{begin:/\(/,end:/\)/,keywords:p,contains:f.concat(["self"]),relevance:0}]),relevance:0},g={begin:"("+a+"[\\*&\\s]+)+"+d,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:p,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:r,keywords:p,relevance:0},{begin:d,returnBegin:!0,contains:[e.inherit(u,{className:"title.function"})],relevance:0},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:p,relevance:0,contains:[n,e.C_BLOCK_COMMENT_MODE,s,l,o,{begin:/\(/,end:/\)/,keywords:p,relevance:0,contains:["self",n,e.C_BLOCK_COMMENT_MODE,s,l,o]}]},o,n,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C",aliases:["h"],keywords:p,disableAutodetect:!0,illegal:"=]/,contains:[{beginKeywords:"final class struct"},e.TITLE_MODE]}]),exports:{preprocessor:c,strings:s,keywords:p}}}),ep.registerLanguage("cpp",function(e){let t=e.regex,n=e.COMMENT("//","$",{contains:[{begin:/\\\n/}]}),r="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",a="(?!struct)("+r+"|"+t.optional(i)+"[a-zA-Z_]\\w*"+t.optional("<[^<>]+>")+")",o={className:"type",begin:"\\b[a-z\\d_]*_t\\b"},s={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},l={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(s,{className:"string"}),{className:"string",begin:/<.*?>/},n,e.C_BLOCK_COMMENT_MODE]},u={className:"title",begin:t.optional(i)+e.IDENT_RE,relevance:0},d=t.optional(i)+e.IDENT_RE+"\\s*\\(",p={type:["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"],keyword:["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"],literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"],_type_hints:["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"]},f={className:"function.dispatch",relevance:0,keywords:{_hint:["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"]},begin:t.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,t.lookahead(/(<[^<>]+>|)\s*\(/))},m=[f,c,o,n,e.C_BLOCK_COMMENT_MODE,l,s],g={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:p,contains:m.concat([{begin:/\(/,end:/\)/,keywords:p,contains:m.concat(["self"]),relevance:0}]),relevance:0},E={className:"function",begin:"("+a+"[\\*&\\s]+)+"+d,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:p,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:r,keywords:p,relevance:0},{begin:d,returnBegin:!0,contains:[u],relevance:0},{begin:/::/,relevance:0},{begin:/:/,endsWithParent:!0,contains:[s,l]},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:p,relevance:0,contains:[n,e.C_BLOCK_COMMENT_MODE,s,l,o,{begin:/\(/,end:/\)/,keywords:p,relevance:0,contains:["self",n,e.C_BLOCK_COMMENT_MODE,s,l,o]}]},o,n,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C++",aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:p,illegal:"",keywords:p,contains:["self",o]},{begin:e.IDENT_RE+"::",keywords:p},{match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/],className:{1:"keyword",3:"title.class"}}])}}),ep.registerLanguage("csharp",function(e){let t={keyword:["abstract","as","base","break","case","catch","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","scoped","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while"].concat(["add","alias","and","ascending","async","await","by","descending","equals","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","remove","select","set","unmanaged","value|0","var","when","where","with","yield"]),built_in:["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort"],literal:["default","false","null","true"]},n=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),r={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},i={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},a=e.inherit(i,{illegal:/\n/}),o={className:"subst",begin:/\{/,end:/\}/,keywords:t},s=e.inherit(o,{illegal:/\n/}),l={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/},e.BACKSLASH_ESCAPE,s]},c={className:"string",begin:/\$@"/,end:'"',contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},o]},u=e.inherit(c,{illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},s]});o.contains=[c,l,i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,r,e.C_BLOCK_COMMENT_MODE],s.contains=[u,l,a,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,r,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];let d={variants:[c,l,i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},p={begin:"<",end:">",contains:[{beginKeywords:"in out"},n]},f=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",m={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:t,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:""},{begin:""}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{keyword:"if else elif endif define undef warning error line region endregion pragma checksum"}},d,r,{beginKeywords:"class interface",relevance:0,end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},n,p,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",relevance:0,end:/[{;=]/,illegal:/[^\s:]/,contains:[n,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/,contains:[n,p,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[(?=[\\w])",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+f+"\\s+)+"+e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:t,contains:[{beginKeywords:"public private protected static internal protected abstract async extern override unsafe virtual new sealed partial",relevance:0},{begin:e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0,contains:[e.TITLE_MODE,p],relevance:0},{match:/\(\)/},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,relevance:0,contains:[d,r,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},m]}}),ep.registerLanguage("css",function(e){let t=e.regex,n=MODES(e),l=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE];return{name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"},contains:[n.BLOCK_COMMENT,{begin:/-(webkit|moz|ms|o)-(?=[a-z])/},n.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0},{className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{begin:":("+a.join("|")+")"},{begin:":(:)?("+o.join("|")+")"}]},n.CSS_VARIABLE,{className:"attribute",begin:"\\b("+s.join("|")+")\\b"},{begin:/:/,end:/[;}{]/,contains:[n.BLOCK_COMMENT,n.HEXCOLOR,n.IMPORTANT,n.CSS_NUMBER_MODE,...l,{begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri"},contains:[...l,{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}]},n.FUNCTION_DISPATCH]},{begin:t.lookahead(/@/),end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword",begin:/@-?\w[\w]*(-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:"and or not only",attribute:i.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute"},...l,n.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"\\b("+r.join("|")+")\\b"}]}}),ep.registerLanguage("diff",function(e){let t=e.regex;return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,match:t.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/)},{className:"comment",variants:[{begin:t.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/),end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/,end:/$/}]}}),ep.registerLanguage("go",function(e){let t={keyword:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var"],type:["bool","byte","complex64","complex128","error","float32","float64","int8","int16","int32","int64","string","uint8","uint16","uint32","uint64","int","uint","uintptr","rune"],literal:["true","false","iota","nil"],built_in:["append","cap","close","complex","copy","imag","len","make","new","panic","print","println","real","recover","delete"]};return{name:"Go",aliases:["golang"],keywords:t,illegal:"recurRegex(e,t,n-1))}("(?:<"+n+"~~~(?:\\s*,\\s*"+n+"~~~)*>)?",/~~~/g,2),i={keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do","sealed","yield","permits"],literal:["false","true","null"],type:["char","boolean","long","float","int","byte","short","double"],built_in:["super","this"]},a={className:"meta",begin:"@"+n,contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},o={className:"params",begin:/\(/,end:/\)/,keywords:i,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0};return{name:"Java",aliases:["jsp"],keywords:i,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{begin:/import java\.[a-z]+\./,keywords:"import",relevance:2},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/,className:"string",contains:[e.BACKSLASH_ESCAPE]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,n],className:{1:"keyword",3:"title.class"}},{match:/non-sealed/,scope:"keyword"},{begin:[t.concat(/(?!else)/,n),/\s+/,n,/\s+/,/=(?!=)/],className:{1:"type",3:"variable",5:"operator"}},{begin:[/record/,/\s+/,n],className:{1:"keyword",3:"title.class"},contains:[o,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"new throw return else",relevance:0},{begin:["(?:"+r+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{2:"title.function"},keywords:i,contains:[{className:"params",begin:/\(/,end:/\)/,keywords:i,relevance:0,contains:[a,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,d,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},d,a]}}),ep.registerLanguage("javascript",function(e){var t;let n=e.regex,hasClosingTag=(e,{after:t})=>{let n="",end:""},i={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,t)=>{let n;let r=e[0].length+e.index,i=e.input[r];if("<"===i||","===i){t.ignoreMatch();return}">"!==i||hasClosingTag(e,{after:r})||t.ignoreMatch();let a=e.input.substring(r);if((n=a.match(/^\s*=/))||(n=a.match(/^\s+extends\s+/))&&0===n.index){t.ignoreMatch();return}}},a={$pattern:p,keyword:f,literal:m,built_in:_,"variable.language":T},o="[0-9](_?[0-9])*",s=`\\.(${o})`,l="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",c={className:"number",variants:[{begin:`(\\b(${l})((${s})|\\.)?|(${s}))[eE][+-]?(${o})\\b`},{begin:`\\b(${l})\\b((${s})\\b|\\.)?|(${s})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},u={className:"subst",begin:"\\$\\{",end:"\\}",keywords:a,contains:[]},d={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,u],subLanguage:"xml"}},A={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,u],subLanguage:"css"}},C={begin:"gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,u],subLanguage:"graphql"}},y={className:"string",begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,u]},k=e.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:p+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),N={className:"comment",variants:[k,e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]},S=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,d,A,C,y,{match:/\$\d+/},c];u.contains=S.concat({begin:/\{/,end:/\}/,keywords:a,contains:["self"].concat(S)});let D=[].concat(N,u.contains),x=D.concat([{begin:/\(/,end:/\)/,keywords:a,contains:["self"].concat(D)}]),O={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:a,contains:x},v={variants:[{match:[/class/,/\s+/,p,/\s+/,/extends/,/\s+/,n.concat(p,"(",n.concat(/\./,p),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,p],scope:{1:"keyword",3:"title.class"}}]},I={relevance:0,match:n.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...g,...E]}},w={match:n.concat(/\b/,(t=[...b,"super","import"],n.concat("(?!",t.join("|"),")")),p,n.lookahead(/\(/)),className:"title.function",relevance:0},R={begin:n.concat(/\./,n.lookahead(n.concat(p,/(?![0-9A-Za-z$_(])/))),end:p,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},F="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+e.UNDERSCORE_IDENT_RE+")\\s*=>",M={match:[/const|var|let/,/\s+/,p,/\s*/,/=\s*/,/(async\s*)?/,n.lookahead(F)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[O]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:a,exports:{PARAMS_CONTAINS:x,CLASS_REFERENCE:I},illegal:/#(?![$_A-z])/,contains:[e.SHEBANG({label:"shebang",binary:"node",relevance:5}),{label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,d,A,C,y,N,{match:/\$\d+/},c,I,{className:"attr",begin:p+n.lookahead(":"),relevance:0},M,{begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[N,e.REGEXP_MODE,{className:"function",begin:F,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:a,contains:x}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:r.begin,end:r.end},{match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:i.begin,"on:begin":i.isTrulyOpeningTag,end:i.end}],subLanguage:"xml",contains:[{begin:i.begin,end:i.end,skip:!0,contains:["self"]}]}]},{variants:[{match:[/function/,/\s+/,p,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[O],illegal:/%/},{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[O,e.inherit(e.TITLE_MODE,{begin:p,className:"title.function"})]},{match:/\.\.\./,relevance:0},R,{match:"\\$"+p,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[O]},w,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"},v,{match:[/get|set/,/\s+/,p,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},O]},{match:/\$[(.]/}]}}),ep.registerLanguage("json",function(e){let t=["true","false","null"],n={scope:"literal",beginKeywords:t.join(" ")};return{name:"JSON",keywords:{literal:t},contains:[{className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},{match:/[{}[\],:]/,className:"punctuation",relevance:0},e.QUOTE_STRING_MODE,n,e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],illegal:"\\S"}}),ep.registerLanguage("kotlin",function(e){let t={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},n={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},r={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},i={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},a={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[i,r]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,i,r]}]};r.contains.push(a);let o={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},s={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(a,{className:"string"}),"self"]}]},l=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),c={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]};return c.variants[1].contains=[c],c.variants[1].contains=[c],{name:"Kotlin",aliases:["kt","kts"],keywords:t,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,l,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},n,o,s,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:t,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:t,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[c,e.C_LINE_COMMENT_MODE,l],relevance:0},e.C_LINE_COMMENT_MODE,l,o,s,a,e.C_NUMBER_MODE]},l]},{begin:[/class|interface|trait/,/\s+/,e.UNDERSCORE_IDENT_RE],beginScope:{3:"title.class"},keywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,){\s]|$/,excludeBegin:!0,returnEnd:!0},o,s]},a,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},k]}}),ep.registerLanguage("less",function(e){let t=less_MODES(e),n="[\\w-]+",r="("+n+"|@\\{"+n+"\\})",i=[],a=[],STRING_MODE=function(e){return{className:"string",begin:"~?"+e+".*?"+e}},IDENT_MODE=function(e,t,n){return{className:e,begin:t,relevance:n}},o={$pattern:/[a-z-]+/,keyword:"and or not only",attribute:S.join(" ")};a.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,STRING_MODE("'"),STRING_MODE('"'),t.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},t.HEXCOLOR,{begin:"\\(",end:"\\)",contains:a,keywords:o,relevance:0},IDENT_MODE("variable","@@?"+n,10),IDENT_MODE("variable","@\\{"+n+"\\}"),IDENT_MODE("built_in","~?`[^`]*?`"),{className:"attribute",begin:n+"\\s*:",end:":",returnBegin:!0,excludeEnd:!0},t.IMPORTANT,{beginKeywords:"and not"},t.FUNCTION_DISPATCH);let s=a.concat({begin:/\{/,end:/\}/,contains:i}),l={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(a)},c={begin:r+"\\s*:",returnBegin:!0,end:/[;}]/,relevance:0,contains:[{begin:/-(webkit|moz|ms|o)-/},t.CSS_VARIABLE,{className:"attribute",begin:"\\b("+O.join("|")+")\\b",end:/(?=:)/,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:a}}]},u={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:r,end:/\{/}],returnBegin:!0,returnEnd:!0,illegal:"[<='$\"]",relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l,IDENT_MODE("keyword","all\\b"),IDENT_MODE("variable","@\\{"+n+"\\}"),{begin:"\\b("+N.join("|")+")\\b",className:"selector-tag"},t.CSS_NUMBER_MODE,IDENT_MODE("selector-tag",r,0),IDENT_MODE("selector-id","#"+r),IDENT_MODE("selector-class","\\."+r,0),IDENT_MODE("selector-tag","&",0),t.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",begin:":("+D.join("|")+")"},{className:"selector-pseudo",begin:":(:)?("+x.join("|")+")"},{begin:/\(/,end:/\)/,relevance:0,contains:s},{begin:"!important"},t.FUNCTION_DISPATCH]},d={begin:n+":(:)?"+`(${v.join("|")})`,returnBegin:!0,contains:[u]};return i.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",keywords:o,returnEnd:!0,contains:a,relevance:0}},{className:"variable",variants:[{begin:"@"+n+"\\s*:",relevance:15},{begin:"@"+n}],starts:{end:"[;}]",returnEnd:!0,contains:s}},d,c,u,l,t.FUNCTION_DISPATCH),{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:i}}),ep.registerLanguage("lua",function(e){let t="\\[=*\\[",n="\\]=*\\]",r={begin:t,end:n,contains:["self"]},i=[e.COMMENT("--(?!"+t+")","$"),e.COMMENT("--"+t,n,{contains:[r],relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:i.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:i}].concat(i)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:t,end:n,contains:[r],relevance:5}])}}),ep.registerLanguage("makefile",function(e){let t={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%",subLanguage:"xml",relevance:0},r={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,relevance:2},{begin:t.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/),relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}]},i={className:"strong",contains:[],variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}]},a={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{begin:/_(?![_\s])/,end:/_/,relevance:0}]},o=e.inherit(i,{contains:[]}),s=e.inherit(a,{contains:[]});i.contains.push(s),a.contains.push(o);let l=[n,r];[i,a,o,s].forEach(e=>{e.contains=e.contains.concat(l)}),l=l.concat(i,a);let c={className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:l},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:l}]}]},u={className:"quote",begin:"^>\\s+",contains:l,end:"$"};return{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[c,n,{className:"bullet",begin:"^[ ]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i,a,u,{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},r,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}),ep.registerLanguage("objectivec",function(e){let t=/[a-zA-Z@][a-zA-Z0-9_]*/,n={$pattern:t,keyword:["@interface","@class","@protocol","@implementation"]};return{name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"],keywords:{"variable.language":["this","super"],$pattern:t,keyword:["while","export","sizeof","typedef","const","struct","for","union","volatile","static","mutable","if","do","return","goto","enum","else","break","extern","asm","case","default","register","explicit","typename","switch","continue","inline","readonly","assign","readwrite","self","@synchronized","id","typeof","nonatomic","IBOutlet","IBAction","strong","weak","copy","in","out","inout","bycopy","byref","oneway","__strong","__weak","__block","__autoreleasing","@private","@protected","@public","@try","@property","@end","@throw","@catch","@finally","@autoreleasepool","@synthesize","@dynamic","@selector","@optional","@required","@encode","@package","@import","@defs","@compatibility_alias","__bridge","__bridge_transfer","__bridge_retained","__bridge_retain","__covariant","__contravariant","__kindof","_Nonnull","_Nullable","_Null_unspecified","__FUNCTION__","__PRETTY_FUNCTION__","__attribute__","getter","setter","retain","unsafe_unretained","nonnull","nullable","null_unspecified","null_resettable","class","instancetype","NS_DESIGNATED_INITIALIZER","NS_UNAVAILABLE","NS_REQUIRES_SUPER","NS_RETURNS_INNER_POINTER","NS_INLINE","NS_AVAILABLE","NS_DEPRECATED","NS_ENUM","NS_OPTIONS","NS_SWIFT_UNAVAILABLE","NS_ASSUME_NONNULL_BEGIN","NS_ASSUME_NONNULL_END","NS_REFINED_FOR_SWIFT","NS_SWIFT_NAME","NS_SWIFT_NOTHROW","NS_DURING","NS_HANDLER","NS_ENDHANDLER","NS_VALUERETURN","NS_VOIDRETURN"],literal:["false","true","FALSE","TRUE","nil","YES","NO","NULL"],built_in:["dispatch_once_t","dispatch_queue_t","dispatch_sync","dispatch_async","dispatch_once"],type:["int","float","char","unsigned","signed","short","long","double","wchar_t","unichar","void","bool","BOOL","id|0","_Bool"]},illegal:"/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+n.keyword.join("|")+")\\b",end:/(\{|$)/,excludeEnd:!0,keywords:n,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}),ep.registerLanguage("perl",function(e){let t=e.regex,n=/[dualxmsipngr]{0,12}/,r={$pattern:/[\w.]+/,keyword:"abs accept alarm and atan2 bind binmode bless break caller chdir chmod chomp chop chown chr chroot close closedir connect continue cos crypt dbmclose dbmopen defined delete die do dump each else elsif endgrent endhostent endnetent endprotoent endpwent endservent eof eval exec exists exit exp fcntl fileno flock for foreach fork format formline getc getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr getnetbyname getnetent getpeername getpgrp getpriority getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid getservbyname getservbyport getservent getsockname getsockopt given glob gmtime goto grep gt hex if index int ioctl join keys kill last lc lcfirst length link listen local localtime log lstat lt ma map mkdir msgctl msgget msgrcv msgsnd my ne next no not oct open opendir or ord our pack package pipe pop pos print printf prototype push q|0 qq quotemeta qw qx rand read readdir readline readlink readpipe recv redo ref rename require reset return reverse rewinddir rindex rmdir say scalar seek seekdir select semctl semget semop send setgrent sethostent setnetent setpgrp setpriority setprotoent setpwent setservent setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep socket socketpair sort splice split sprintf sqrt srand stat state study sub substr symlink syscall sysopen sysread sysseek system syswrite tell telldir tie tied time times tr truncate uc ucfirst umask undef unless unlink unpack unshift untie until use utime values vec wait waitpid wantarray warn when while write x|0 xor y|0"},i={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:r},a={begin:/->\{/,end:/\}/},o={variants:[{begin:/\$\d/},{begin:t.concat(/[$%@](\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])")},{begin:/[$%@][^\s\w{]/,relevance:0}]},s=[e.BACKSLASH_ESCAPE,i,o],l=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],PAIRED_DOUBLE_RE=(e,r,i="\\1")=>{let a="\\1"===i?i:t.concat(i,r);return t.concat(t.concat("(?:",e,")"),r,/(?:\\.|[^\\\/])*?/,a,/(?:\\.|[^\\\/])*?/,i,n)},PAIRED_RE=(e,r,i)=>t.concat(t.concat("(?:",e,")"),r,/(?:\\.|[^\\\/])*?/,i,n),c=[o,e.HASH_COMMENT_MODE,e.COMMENT(/^=\w/,/=cut/,{endsWithParent:!0}),a,{className:"string",contains:s,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{begin:"-?\\w+\\s*=>",relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",variants:[{begin:PAIRED_DOUBLE_RE("s|tr|y",t.either(...l,{capture:!0}))},{begin:PAIRED_DOUBLE_RE("s|tr|y","\\(","\\)")},{begin:PAIRED_DOUBLE_RE("s|tr|y","\\[","\\]")},{begin:PAIRED_DOUBLE_RE("s|tr|y","\\{","\\}")}],relevance:2},{className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{begin:PAIRED_RE("(?:m|qr)?",/\//,/\//)},{begin:PAIRED_RE("m|qr",t.either(...l,{capture:!0}),/\1/)},{begin:PAIRED_RE("m|qr",/\(/,/\)/)},{begin:PAIRED_RE("m|qr",/\[/,/\]/)},{begin:PAIRED_RE("m|qr",/\{/,/\}/)}]}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return i.contains=c,a.contains=c,{name:"Perl",aliases:["pl","pm"],keywords:r,contains:c}}),ep.registerLanguage("php",function(e){let t=e.regex,n=/(?![A-Za-z0-9])(?![$])/,r=t.concat(/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/,n),i=t.concat(/(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/,n),a={scope:"variable",match:"\\$+"+r},o={scope:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]},s=e.inherit(e.APOS_STRING_MODE,{illegal:null}),l=e.inherit(e.QUOTE_STRING_MODE,{illegal:null,contains:e.QUOTE_STRING_MODE.contains.concat(o)}),c={begin:/<<<[ \t]*(?:(\w+)|"(\w+)")\n/,end:/[ \t]*(\w+)\b/,contains:e.QUOTE_STRING_MODE.contains.concat(o),"on:begin":(e,t)=>{t.data._beginMatch=e[1]||e[2]},"on:end":(e,t)=>{t.data._beginMatch!==e[1]&&t.ignoreMatch()}},u=e.END_SAME_AS_BEGIN({begin:/<<<[ \t]*'(\w+)'\n/,end:/[ \t]*(\w+)\b/}),d="[ \n]",p={scope:"string",variants:[l,s,c,u]},f={scope:"number",variants:[{begin:"\\b0[bB][01]+(?:_[01]+)*\\b"},{begin:"\\b0[oO][0-7]+(?:_[0-7]+)*\\b"},{begin:"\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b"},{begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?"}],relevance:0},m=["false","null","true"],g=["__CLASS__","__DIR__","__FILE__","__FUNCTION__","__COMPILER_HALT_OFFSET__","__LINE__","__METHOD__","__NAMESPACE__","__TRAIT__","die","echo","exit","include","include_once","print","require","require_once","array","abstract","and","as","binary","bool","boolean","break","callable","case","catch","class","clone","const","continue","declare","default","do","double","else","elseif","empty","enddeclare","endfor","endforeach","endif","endswitch","endwhile","enum","eval","extends","final","finally","float","for","foreach","from","global","goto","if","implements","instanceof","insteadof","int","integer","interface","isset","iterable","list","match|0","mixed","new","never","object","or","private","protected","public","readonly","real","return","string","switch","throw","trait","try","unset","use","var","void","while","xor","yield"],E=["Error|0","AppendIterator","ArgumentCountError","ArithmeticError","ArrayIterator","ArrayObject","AssertionError","BadFunctionCallException","BadMethodCallException","CachingIterator","CallbackFilterIterator","CompileError","Countable","DirectoryIterator","DivisionByZeroError","DomainException","EmptyIterator","ErrorException","Exception","FilesystemIterator","FilterIterator","GlobIterator","InfiniteIterator","InvalidArgumentException","IteratorIterator","LengthException","LimitIterator","LogicException","MultipleIterator","NoRewindIterator","OutOfBoundsException","OutOfRangeException","OuterIterator","OverflowException","ParentIterator","ParseError","RangeException","RecursiveArrayIterator","RecursiveCachingIterator","RecursiveCallbackFilterIterator","RecursiveDirectoryIterator","RecursiveFilterIterator","RecursiveIterator","RecursiveIteratorIterator","RecursiveRegexIterator","RecursiveTreeIterator","RegexIterator","RuntimeException","SeekableIterator","SplDoublyLinkedList","SplFileInfo","SplFileObject","SplFixedArray","SplHeap","SplMaxHeap","SplMinHeap","SplObjectStorage","SplObserver","SplPriorityQueue","SplQueue","SplStack","SplSubject","SplTempFileObject","TypeError","UnderflowException","UnexpectedValueException","UnhandledMatchError","ArrayAccess","BackedEnum","Closure","Fiber","Generator","Iterator","IteratorAggregate","Serializable","Stringable","Throwable","Traversable","UnitEnum","WeakReference","WeakMap","Directory","__PHP_Incomplete_Class","parent","php_user_filter","self","static","stdClass"],b={keyword:g,literal:(e=>{let t=[];return e.forEach(e=>{t.push(e),e.toLowerCase()===e?t.push(e.toUpperCase()):t.push(e.toLowerCase())}),t})(m),built_in:E},normalizeKeywords=e=>e.map(e=>e.replace(/\|\d+$/,"")),T={variants:[{match:[/new/,t.concat(d,"+"),t.concat("(?!",normalizeKeywords(E).join("\\b|"),"\\b)"),i],scope:{1:"keyword",4:"title.class"}}]},_=t.concat(r,"\\b(?!\\()"),A={variants:[{match:[t.concat(/::/,t.lookahead(/(?!class\b)/)),_],scope:{2:"variable.constant"}},{match:[/::/,/class/],scope:{2:"variable.language"}},{match:[i,t.concat(/::/,t.lookahead(/(?!class\b)/)),_],scope:{1:"title.class",3:"variable.constant"}},{match:[i,t.concat("::",t.lookahead(/(?!class\b)/))],scope:{1:"title.class"}},{match:[i,/::/,/class/],scope:{1:"title.class",3:"variable.language"}}]},C={scope:"attr",match:t.concat(r,t.lookahead(":"),t.lookahead(/(?!::)/))},y={relevance:0,begin:/\(/,end:/\)/,keywords:b,contains:[C,a,A,e.C_BLOCK_COMMENT_MODE,p,f,T]},k={relevance:0,match:[/\b/,t.concat("(?!fn\\b|function\\b|",normalizeKeywords(g).join("\\b|"),"|",normalizeKeywords(E).join("\\b|"),"\\b)"),r,t.concat(d,"*"),t.lookahead(/(?=\()/)],scope:{3:"title.function.invoke"},contains:[y]};y.contains.push(k);let N=[C,A,e.C_BLOCK_COMMENT_MODE,p,f,T],S={begin:t.concat(/#\[\s*/,i),beginScope:"meta",end:/]/,endScope:"meta",keywords:{literal:m,keyword:["new","array"]},contains:[{begin:/\[/,end:/]/,keywords:{literal:m,keyword:["new","array"]},contains:["self",...N]},...N,{scope:"meta",match:i}]};return{case_insensitive:!1,keywords:b,contains:[S,e.HASH_COMMENT_MODE,e.COMMENT("//","$"),e.COMMENT("/\\*","\\*/",{contains:[{scope:"doctag",match:"@[A-Za-z]+"}]}),{match:/__halt_compiler\(\);/,keywords:"__halt_compiler",starts:{scope:"comment",end:e.MATCH_NOTHING_RE,contains:[{match:/\?>/,scope:"meta",endsParent:!0}]}},{scope:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?=/},{begin:/<\?/,relevance:.1},{begin:/\?>/}]},{scope:"variable.language",match:/\$this\b/},a,k,A,{match:[/const/,/\s/,r],scope:{1:"keyword",3:"variable.constant"}},T,{scope:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[{beginKeywords:"use"},e.UNDERSCORE_TITLE_MODE,{begin:"=>",endsParent:!0},{scope:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:b,contains:["self",a,A,e.C_BLOCK_COMMENT_MODE,p,f]}]},{scope:"class",variants:[{beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait",illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/,contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{scope:"title.class"})]},{beginKeywords:"use",relevance:0,end:";",contains:[{match:/\b(as|const|function)\b/,scope:"keyword"},e.UNDERSCORE_TITLE_MODE]},p,f]}}),ep.registerLanguage("php-template",function(e){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},e.inherit(e.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}),ep.registerLanguage("plaintext",function(e){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}),ep.registerLanguage("python",function(e){let t=e.regex,n=/[\p{XID_Start}_]\p{XID_Continue}*/u,r=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],i={$pattern:/[A-Za-z]\w+|__\w+__/,keyword:r,built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"],literal:["__debug__","Ellipsis","False","None","NotImplemented","True"],type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"]},a={className:"meta",begin:/^(>>>|\.\.\.) /},o={className:"subst",begin:/\{/,end:/\}/,keywords:i,illegal:/#/},s={begin:/\{\{/,relevance:0},l={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,s,o]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,o]},{begin:/([uU]|[rR])'/,end:/'/,relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,o]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,o]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},c="[0-9](_?[0-9])*",u=`(\\b(${c}))?\\.(${c})|\\b(${c})\\.`,d=`\\b|${r.join("|")}`,p={className:"number",relevance:0,variants:[{begin:`(\\b(${c})|(${u}))[eE][+-]?(${c})[jJ]?(?=${d})`},{begin:`(${u})[jJ]?`},{begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${d})`},{begin:`\\b0[bB](_?[01])+[lL]?(?=${d})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${d})`},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${d})`},{begin:`\\b(${c})[jJ](?=${d})`}]},f={className:"comment",begin:t.lookahead(/# type:/),end:/$/,keywords:i,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},m={className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:i,contains:["self",a,p,l,e.HASH_COMMENT_MODE]}]};return o.contains=[l,p,a],{name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:i,illegal:/(<\/|\?)|=>/,contains:[a,p,{begin:/\bself\b/},{beginKeywords:"if",relevance:0},l,f,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,n],scope:{1:"keyword",3:"title.function"},contains:[m]},{variants:[{match:[/\bclass/,/\s+/,n,/\s*/,/\(\s*/,n,/\s*\)/]},{match:[/\bclass/,/\s+/,n]}],scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[p,m,l]}]}}),ep.registerLanguage("python-repl",function(e){return{aliases:["pycon"],contains:[{className:"meta.prompt",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}),ep.registerLanguage("r",function(e){let t=e.regex,n=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/,r=t.either(/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/,/0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/,/(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/),i=/[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/,a=t.either(/[()]/,/[{}]/,/\[\[/,/[[\]]/,/\\/,/,/);return{name:"R",keywords:{$pattern:n,keyword:"function if in break next repeat else for while",literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10",built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm"},contains:[e.COMMENT(/#'/,/$/,{contains:[{scope:"doctag",match:/@examples/,starts:{end:t.lookahead(t.either(/\n^#'\s*(?=@[a-zA-Z]+)/,/\n^(?!#')/)),endsParent:!0}},{scope:"doctag",begin:"@param",end:/$/,contains:[{scope:"variable",variants:[{match:n},{match:/`(?:\\.|[^`\\])+`/}],endsParent:!0}]},{scope:"doctag",match:/@[a-zA-Z]+/},{scope:"keyword",match:/\\[a-zA-Z]+/}]}),e.HASH_COMMENT_MODE,{scope:"string",contains:[e.BACKSLASH_ESCAPE],variants:[e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"',relevance:0},{begin:"'",end:"'",relevance:0}]},{relevance:0,variants:[{scope:{1:"operator",2:"number"},match:[i,r]},{scope:{1:"operator",2:"number"},match:[/%[^%]*%/,r]},{scope:{1:"punctuation",2:"number"},match:[a,r]},{scope:{2:"number"},match:[/[^a-zA-Z0-9._]|^/,r]}]},{scope:{3:"operator"},match:[n,/\s+/,/<-/,/\s+/]},{scope:"operator",relevance:0,variants:[{match:i},{match:/%[^%]*%/}]},{scope:"punctuation",relevance:0,match:a},{begin:"`",end:"`",contains:[{begin:/\\./}]}]}}),ep.registerLanguage("ruby",function(e){let t=e.regex,n="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",r=t.either(/\b([A-Z]+[a-z0-9]+)+/,/\b([A-Z]+[a-z0-9]+)+[A-Z]+/),i=t.concat(r,/(::\w+)*/),a={"variable.constant":["__FILE__","__LINE__","__ENCODING__"],"variable.language":["self","super"],keyword:["alias","and","begin","BEGIN","break","case","class","defined","do","else","elsif","end","END","ensure","for","if","in","module","next","not","or","redo","require","rescue","retry","return","then","undef","unless","until","when","while","yield","include","extend","prepend","public","private","protected","raise","throw"],built_in:["proc","lambda","attr_accessor","attr_reader","attr_writer","define_method","private_constant","module_function"],literal:["true","false","nil"]},o={className:"doctag",begin:"@[A-Za-z]+"},s={begin:"#<",end:">"},l=[e.COMMENT("#","$",{contains:[o]}),e.COMMENT("^=begin","^=end",{contains:[o],relevance:10}),e.COMMENT("^__END__",e.MATCH_NOTHING_RE)],c={className:"subst",begin:/#\{/,end:/\}/,keywords:a},u={className:"string",contains:[e.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/,end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/,end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{begin:/\B\?(\\\d{1,3})/},{begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{begin:t.concat(/<<[-~]?'?/,t.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)),contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,c]})]}]},d="[0-9](_?[0-9])*",p={className:"number",relevance:0,variants:[{begin:`\\b([1-9](_?[0-9])*|0)(\\.(${d}))?([eE][+-]?(${d})|r)?i?\\b`},{begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{begin:"\\b0(_?[0-7])+r?i?\\b"}]},f={variants:[{match:/\(\)/},{className:"params",begin:/\(/,end:/(?=\))/,excludeBegin:!0,endsParent:!0,keywords:a}]},m=[u,{variants:[{match:[/class\s+/,i,/\s+<\s+/,i]},{match:[/\b(class|module)\s+/,i]}],scope:{2:"title.class",4:"title.class.inherited"},keywords:a},{match:[/(include|extend)\s+/,i],scope:{2:"title.class"},keywords:a},{relevance:0,match:[i,/\.new[. (]/],scope:{1:"title.class"}},{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"},{relevance:0,match:r,scope:"title.class"},{match:[/def/,/\s+/,n],scope:{1:"keyword",3:"title.function"},contains:[f]},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[u,{begin:n}],relevance:0},p,{className:"variable",begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{className:"params",begin:/\|/,end:/\|/,excludeBegin:!0,excludeEnd:!0,relevance:0,keywords:a},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(s,l),relevance:0}].concat(s,l);c.contains=m,f.contains=m;let g=[{begin:/^\s*=>/,starts:{end:"$",contains:m}},{className:"meta.prompt",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])",starts:{end:"$",keywords:a,contains:m}}];return l.unshift(s),{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:[e.SHEBANG({binary:"ruby"})].concat(g).concat(l).concat(m)}}),ep.registerLanguage("rust",function(e){let t=e.regex,n={className:"title.function.invoke",relevance:0,begin:t.concat(/\b/,/(?!let\b)/,e.IDENT_RE,t.lookahead(/\s*\(/))},r="([ui](8|16|32|64|128|size)|f(32|64))?",i=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","panic!","file!","format!","format_args!","include_bytes!","include_str!","line!","local_data_key!","module_path!","option_env!","print!","println!","select!","stringify!","try!","unimplemented!","unreachable!","vec!","write!","writeln!","macro_rules!","assert_ne!","debug_assert_ne!"],a=["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"];return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",type:a,keyword:["abstract","as","async","await","become","box","break","const","continue","crate","do","dyn","else","enum","extern","false","final","fn","for","if","impl","in","let","loop","macro","match","mod","move","mut","override","priv","pub","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","unsafe","unsized","use","virtual","where","while","yield"],literal:["true","false","Some","None","Ok","Err"],built_in:i},illegal:""},n]}}),ep.registerLanguage("scss",function(e){let t=scss_MODES(e),n="@[a-z-]+",r={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b",relevance:0};return{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t.CSS_NUMBER_MODE,{className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},t.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag",begin:"\\b("+I.join("|")+")\\b",relevance:0},{className:"selector-pseudo",begin:":("+R.join("|")+")"},{className:"selector-pseudo",begin:":(:)?("+F.join("|")+")"},r,{begin:/\(/,end:/\)/,contains:[t.CSS_NUMBER_MODE]},t.CSS_VARIABLE,{className:"attribute",begin:"\\b("+M.join("|")+")\\b"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:/:/,end:/[;}{]/,relevance:0,contains:[t.BLOCK_COMMENT,r,t.HEXCOLOR,t.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,t.IMPORTANT,t.FUNCTION_DISPATCH]},{begin:"@(page|font-face)",keywords:{$pattern:n,keyword:"@page @font-face"}},{begin:"@",end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/,keyword:"and or not only",attribute:w.join(" ")},contains:[{begin:n,className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute"},r,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,t.HEXCOLOR,t.CSS_NUMBER_MODE]},t.FUNCTION_DISPATCH]}}),ep.registerLanguage("shell",function(e){return{name:"Shell Session",aliases:["console","shellsession"],contains:[{className:"meta.prompt",begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/,subLanguage:"bash"}}]}}),ep.registerLanguage("sql",function(e){let t=e.regex,n=e.COMMENT("--","$"),r=["true","false","unknown"],i=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],a=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],o=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],s=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year","add","asc","collation","desc","final","first","last","view"].filter(e=>!a.includes(e)),l={begin:t.concat(/\b/,t.either(...a),/\s*\(/),relevance:0,keywords:{built_in:a}};return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/,keyword:function(e,{exceptions:t,when:n}={}){return t=t||[],e.map(e=>e.match(/\|\d+$/)||t.includes(e)?e:n(e)?`${e}|0`:e)}(s,{when:e=>e.length<3}),literal:r,type:i,built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"]},contains:[{begin:t.either(...o),relevance:0,keywords:{$pattern:/[\w\.]+/,keyword:s.concat(o),literal:r,type:i}},{className:"type",begin:t.either(...["double precision","large object","with timezone","without timezone"])},l,{className:"variable",begin:/@[a-z0-9][a-z0-9_]*/},{className:"string",variants:[{begin:/'/,end:/'/,contains:[{begin:/''/}]}]},{begin:/"/,end:/"/,contains:[{begin:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,n,{className:"operator",begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0}]}}),ep.registerLanguage("swift",function(e){let t={match:/\s+/,relevance:0},n=e.COMMENT("/\\*","\\*/",{contains:["self"]}),r=[e.C_LINE_COMMENT_MODE,n],i={match:[/\./,either(...L,...B)],className:{2:"keyword"}},a={match:concat(/\./,either(...H)),relevance:0},o=H.filter(e=>"string"==typeof e).concat(["_|0"]),s=H.filter(e=>"string"!=typeof e).concat(P).map(keywordWrapper),l={variants:[{className:"keyword",match:either(...s,...B)}]},c={$pattern:either(/\b\w+/,/#\w+/),keyword:o.concat(G),literal:U},u=[i,a,l],d={match:concat(/\./,either(...K)),relevance:0},p={className:"built_in",match:concat(/\b/,either(...K),/(?=\()/)},f=[d,p],m={match:/->/,relevance:0},g={className:"operator",relevance:0,variants:[{match:$},{match:`\\.(\\.|${q})+`}]},E=[m,g],b="([0-9]_*)+",T="([0-9a-fA-F]_*)+",_={className:"number",relevance:0,variants:[{match:`\\b(${b})(\\.(${b}))?([eE][+-]?(${b}))?\\b`},{match:`\\b0x(${T})(\\.(${T}))?([pP][+-]?(${b}))?\\b`},{match:/\b0o([0-7]_*)+\b/},{match:/\b0b([01]_*)+\b/}]},ESCAPED_CHARACTER=(e="")=>({className:"subst",variants:[{match:concat(/\\/,e,/[0\\tnr"']/)},{match:concat(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}]}),ESCAPED_NEWLINE=(e="")=>({className:"subst",match:concat(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/)}),INTERPOLATION=(e="")=>({className:"subst",label:"interpol",begin:concat(/\\/,e,/\(/),end:/\)/}),MULTILINE_STRING=(e="")=>({begin:concat(e,/"""/),end:concat(/"""/,e),contains:[ESCAPED_CHARACTER(e),ESCAPED_NEWLINE(e),INTERPOLATION(e)]}),SINGLE_LINE_STRING=(e="")=>({begin:concat(e,/"/),end:concat(/"/,e),contains:[ESCAPED_CHARACTER(e),INTERPOLATION(e)]}),A={className:"string",variants:[MULTILINE_STRING(),MULTILINE_STRING("#"),MULTILINE_STRING("##"),MULTILINE_STRING("###"),SINGLE_LINE_STRING(),SINGLE_LINE_STRING("#"),SINGLE_LINE_STRING("##"),SINGLE_LINE_STRING("###")]},C={match:concat(/`/,Q,/`/)},y={className:"variable",match:`\\$${V}+`},k=[C,{className:"variable",match:/\$\d+/},y],N={match:/(@|#(un)?)available/,className:"keyword",starts:{contains:[{begin:/\(/,end:/\)/,keywords:X,contains:[...E,_,A]}]}},S={className:"keyword",match:concat(/@/,either(...Z))},D={className:"meta",match:concat(/@/,Q)},x=[N,S,D],O={match:lookahead(/\b[A-Z]/),relevance:0,contains:[{className:"type",match:concat(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,V,"+")},{className:"type",match:Y,relevance:0},{match:/[?!]+/,relevance:0},{match:/\.\.\./,relevance:0},{match:concat(/\s+&\s+/,lookahead(Y)),relevance:0}]},v={begin://,keywords:c,contains:[...r,...u,...x,m,O]};O.contains.push(v);let I={match:concat(Q,/\s*:/),keywords:"_|0",relevance:0},w={begin:/\(/,end:/\)/,relevance:0,keywords:c,contains:["self",I,...r,...u,...f,...E,_,A,...k,...x,O]},R={begin://,contains:[...r,O]},F={begin:either(lookahead(concat(Q,/\s*:/)),lookahead(concat(Q,/\s+/,Q,/\s*:/))),end:/:/,relevance:0,contains:[{className:"keyword",match:/\b_\b/},{className:"params",match:Q}]},M={begin:/\(/,end:/\)/,keywords:c,contains:[F,...r,...u,...E,_,A,...x,O,w],endsParent:!0,illegal:/["']/},j={match:[/func/,/\s+/,either(C.match,Q,$)],className:{1:"keyword",3:"title.function"},contains:[R,M,t],illegal:[/\[/,/%/]},W={begin:[/precedencegroup/,/\s+/,Y],className:{1:"keyword",3:"title"},contains:[O],keywords:[...z,...U],end:/}/};for(let e of A.variants){let t=e.contains.find(e=>"interpol"===e.label);t.keywords=c;let n=[...u,...f,...E,_,A,...k];t.contains=[...n,{begin:/\(/,end:/\)/,contains:["self",...n]}]}return{name:"Swift",keywords:c,contains:[...r,j,{match:[/\b(?:subscript|init[?!]?)/,/\s*(?=[<(])/],className:{1:"keyword"},contains:[R,M,t],illegal:/\[|%/},{beginKeywords:"struct protocol class extension enum actor",end:"\\{",excludeEnd:!0,keywords:c,contains:[e.inherit(e.TITLE_MODE,{className:"title.class",begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/}),...u]},{match:[/operator/,/\s+/,$],className:{1:"keyword",3:"title"}},W,{beginKeywords:"import",end:/$/,contains:[...r],relevance:0},...u,...f,...E,_,A,...k,...x,O,w]}}),ep.registerLanguage("typescript",function(e){let t=function(e){var t;let n=e.regex,hasClosingTag=(e,{after:t})=>{let n="",end:""},i={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,t)=>{let n;let r=e[0].length+e.index,i=e.input[r];if("<"===i||","===i){t.ignoreMatch();return}">"!==i||hasClosingTag(e,{after:r})||t.ignoreMatch();let a=e.input.substring(r);if((n=a.match(/^\s*=/))||(n=a.match(/^\s+extends\s+/))&&0===n.index){t.ignoreMatch();return}}},a={$pattern:J,keyword:ee,literal:et,built_in:eo,"variable.language":ea},o="[0-9](_?[0-9])*",s=`\\.(${o})`,l="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",c={className:"number",variants:[{begin:`(\\b(${l})((${s})|\\.)?|(${s}))[eE][+-]?(${o})\\b`},{begin:`\\b(${l})\\b((${s})\\b|\\.)?|(${s})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},u={className:"subst",begin:"\\$\\{",end:"\\}",keywords:a,contains:[]},d={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,u],subLanguage:"xml"}},p={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,u],subLanguage:"css"}},f={begin:"gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,u],subLanguage:"graphql"}},m={className:"string",begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,u]},g=e.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:J+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),E={className:"comment",variants:[g,e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]},b=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,d,p,f,m,{match:/\$\d+/},c];u.contains=b.concat({begin:/\{/,end:/\}/,keywords:a,contains:["self"].concat(b)});let T=[].concat(E,u.contains),_=T.concat([{begin:/\(/,end:/\)/,keywords:a,contains:["self"].concat(T)}]),A={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:a,contains:_},C={variants:[{match:[/class/,/\s+/,J,/\s+/,/extends/,/\s+/,n.concat(J,"(",n.concat(/\./,J),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,J],scope:{1:"keyword",3:"title.class"}}]},y={relevance:0,match:n.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...en,...er]}},k={match:n.concat(/\b/,(t=[...ei,"super","import"],n.concat("(?!",t.join("|"),")")),J,n.lookahead(/\(/)),className:"title.function",relevance:0},N={begin:n.concat(/\./,n.lookahead(n.concat(J,/(?![0-9A-Za-z$_(])/))),end:J,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},S="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+e.UNDERSCORE_IDENT_RE+")\\s*=>",D={match:[/const|var|let/,/\s+/,J,/\s*/,/=\s*/,/(async\s*)?/,n.lookahead(S)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[A]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:a,exports:{PARAMS_CONTAINS:_,CLASS_REFERENCE:y},illegal:/#(?![$_A-z])/,contains:[e.SHEBANG({label:"shebang",binary:"node",relevance:5}),{label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,d,p,f,m,E,{match:/\$\d+/},c,y,{className:"attr",begin:J+n.lookahead(":"),relevance:0},D,{begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[E,e.REGEXP_MODE,{className:"function",begin:S,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:a,contains:_}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:r.begin,end:r.end},{match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:i.begin,"on:begin":i.isTrulyOpeningTag,end:i.end}],subLanguage:"xml",contains:[{begin:i.begin,end:i.end,skip:!0,contains:["self"]}]}]},{variants:[{match:[/function/,/\s+/,J,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[A],illegal:/%/},{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[A,e.inherit(e.TITLE_MODE,{begin:J,className:"title.function"})]},{match:/\.\.\./,relevance:0},N,{match:"\\$"+J,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[A]},k,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"},C,{match:[/get|set/,/\s+/,J,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},A]},{match:/\$[(.]/}]}}(e),n=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],r={beginKeywords:"namespace",end:/\{/,excludeEnd:!0,contains:[t.exports.CLASS_REFERENCE]},i={beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:{keyword:"interface extends",built_in:n},contains:[t.exports.CLASS_REFERENCE]},a={$pattern:J,keyword:ee.concat(["type","namespace","interface","public","private","protected","implements","declare","abstract","readonly","enum","override"]),literal:et,built_in:eo.concat(n),"variable.language":ea},o={className:"meta",begin:"@"+J},swapMode=(e,t,n)=>{let r=e.contains.findIndex(e=>e.label===t);if(-1===r)throw Error("can not find mode to replace");e.contains.splice(r,1,n)};Object.assign(t.keywords,a),t.exports.PARAMS_CONTAINS.push(o),t.contains=t.contains.concat([o,r,i]),swapMode(t,"shebang",e.SHEBANG()),swapMode(t,"use_strict",{className:"meta",relevance:10,begin:/^\s*['"]use strict['"]/});let s=t.contains.find(e=>"func.def"===e.label);return s.relevance=0,Object.assign(t,{name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),t}),ep.registerLanguage("vbnet",function(e){let t=e.regex,n=/\d{1,2}\/\d{1,2}\/\d{4}/,r=/\d{4}-\d{1,2}-\d{1,2}/,i=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,a=/\d{1,2}(:\d{1,2}){1,2}/,o={className:"literal",variants:[{begin:t.concat(/# */,t.either(r,n),/ *#/)},{begin:t.concat(/# */,a,/ *#/)},{begin:t.concat(/# */,i,/ *#/)},{begin:t.concat(/# */,t.either(r,n),/ +/,t.either(i,a),/ *#/)}]},s=e.COMMENT(/'''/,/$/,{contains:[{className:"doctag",begin:/<\/?/,end:/>/}]}),l=e.COMMENT(null,/$/,{variants:[{begin:/'/},{begin:/([\t ]|^)REM(?=\s)/}]});return{name:"Visual Basic .NET",aliases:["vb"],case_insensitive:!0,classNameAliases:{label:"symbol"},keywords:{keyword:"addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield",built_in:"addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort",type:"boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort",literal:"true false nothing"},illegal:"//|\\{|\\}|endif|gosub|variant|wend|^\\$ ",contains:[{className:"string",begin:/"(""|[^/n])"C\b/},{className:"string",begin:/"/,end:/"/,illegal:/\n/,contains:[{begin:/""/}]},o,{className:"number",relevance:0,variants:[{begin:/\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/},{begin:/\b\d[\d_]*((U?[SIL])|[%&])?/},{begin:/&H[\dA-F_]+((U?[SIL])|[%&])?/},{begin:/&O[0-7_]+((U?[SIL])|[%&])?/},{begin:/&B[01_]+((U?[SIL])|[%&])?/}]},{className:"label",begin:/^\w+:/},s,l,{className:"meta",begin:/[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/,end:/$/,keywords:{keyword:"const disable else elseif enable end externalsource if region then"},contains:[l]}]}}),ep.registerLanguage("wasm",function(e){e.regex;let t=e.COMMENT(/\(;/,/;\)/);t.contains.push("self");let n=e.COMMENT(/;;/,/$/);return{name:"WebAssembly",keywords:{$pattern:/[\w.]+/,keyword:["anyfunc","block","br","br_if","br_table","call","call_indirect","data","drop","elem","else","end","export","func","global.get","global.set","local.get","local.set","local.tee","get_global","get_local","global","if","import","local","loop","memory","memory.grow","memory.size","module","mut","nop","offset","param","result","return","select","set_global","set_local","start","table","tee_local","then","type","unreachable"]},contains:[n,t,{match:[/(?:offset|align)/,/\s*/,/=/],className:{1:"keyword",3:"operator"}},{className:"variable",begin:/\$[\w_]+/},{match:/(\((?!;)|\))+/,className:"punctuation",relevance:0},{begin:[/(?:func|call|call_indirect)/,/\s+/,/\$[^\s)]+/],className:{1:"keyword",3:"title.function"}},e.QUOTE_STRING_MODE,{match:/(i32|i64|f32|f64)(?!\.)/,className:"type"},{className:"keyword",match:/\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/},{className:"number",relevance:0,match:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/}]}}),ep.registerLanguage("xml",function(e){let t=e.regex,n=t.concat(/[\p{L}_]/u,t.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),r={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},i={begin:/\s/,contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},a=e.inherit(i,{begin:/\(/,end:/\)/}),o=e.inherit(e.APOS_STRING_MODE,{className:"string"}),s=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),l={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[i,s,o,a,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[i,a,s,o]}]}]},e.COMMENT(//,{relevance:10}),{begin://,relevance:10},r,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[s]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[l],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[l],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:t.concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:n,relevance:0,starts:l}]},{className:"tag",begin:t.concat(/<\//,t.lookahead(t.concat(n,/>/))),contains:[{className:"name",begin:n,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}),ep.registerLanguage("yaml",function(e){let t="true false yes no null",n="[\\w#;/?:@&=+$,.~*'()[\\]]+",r={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},i=e.inherit(r,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),a={end:",",endsWithParent:!0,excludeEnd:!0,keywords:t,relevance:0},o=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ ]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ ]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ ]|$)"}]},{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+n},{className:"type",begin:"!<"+n+">"},{className:"type",begin:"!"+n},{className:"type",begin:"!!"+n},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:t,keywords:{literal:t}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},{begin:/\{/,end:/\}/,contains:[a],illegal:"\\n",relevance:0},{begin:"\\[",end:"\\]",contains:[a],illegal:"\\n",relevance:0},r],s=[...o];return s.pop(),s.push(i),a.contains=s,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:o}});var eh=n(36191),ef=n(96093);let findAfter=function(e,t,n){let r=(0,ef.O)(n);if(!e||!e.type||!e.children)throw Error("Expected parent node");if("number"==typeof t){if(t<0||t===Number.POSITIVE_INFINITY)throw Error("Expected positive finite number as index")}else if((t=e.children.indexOf(t))<0)throw Error("Expected child node or index");for(;++tn&&(n=e):e&&(void 0!==n&&n>-1&&l.push("\n".repeat(n)||" "),n=-1,l.push(e))}return l.join("")}function collectText(e,t){let n;let r=String(e.value),i=[],a=[],o=0;for(;o<=r.length;){em.lastIndex=o;let e=em.exec(r),n=e&&"index"in e?e.index:r.length;i.push(function(e,t,n){let r;let i=[],a=0;for(;a-1?r.slice(0,e):r}return(e,t)=>{(0,ey.Vn)(e,"element",(e,n,c)=>{let u;if(!c||!("tagName"in c)||"pre"!==c.tagName||"code"!==e.tagName||!e.properties)return;let d=function(e){let t=e.properties&&e.properties.className,n=-1;if(Array.isArray(t))for(;++n0&&(e.children=u.children)}})}}},16861:function(e,t,n){"use strict";n.d(t,{Z:function(){return rehypeParse}});var r=n(7045),i=n(62718);let a={abandonedHeadElementChild:{reason:"Unexpected metadata element after head",description:"Unexpected element after head. Expected the element before ``",url:!1},abruptClosingOfEmptyComment:{reason:"Unexpected abruptly closed empty comment",description:"Unexpected `>` or `->`. Expected `-->` to close comments"},abruptDoctypePublicIdentifier:{reason:"Unexpected abruptly closed public identifier",description:"Unexpected `>`. Expected a closing `\"` or `'` after the public identifier"},abruptDoctypeSystemIdentifier:{reason:"Unexpected abruptly closed system identifier",description:"Unexpected `>`. Expected a closing `\"` or `'` after the identifier identifier"},absenceOfDigitsInNumericCharacterReference:{reason:"Unexpected non-digit at start of numeric character reference",description:"Unexpected `%c`. Expected `[0-9]` for decimal references or `[0-9a-fA-F]` for hexadecimal references"},cdataInHtmlContent:{reason:"Unexpected CDATA section in HTML",description:"Unexpected `` in ``",description:"Unexpected text character `%c`. Only use text in `