diff --git a/BSIPA-Meta/BSIPA-Meta.csproj b/BSIPA-Meta/BSIPA-Meta.csproj
index cbdb384e..2cf0f46f 100644
--- a/BSIPA-Meta/BSIPA-Meta.csproj
+++ b/BSIPA-Meta/BSIPA-Meta.csproj
@@ -1,7 +1,7 @@
- net35;net461
+ net461x86;x64Debug;Release;Verbose;Verbose_Release
@@ -59,9 +59,11 @@
+
+
@@ -87,3 +89,4 @@
+
diff --git a/IPA.Injector/IPA.Injector.csproj b/IPA.Injector/IPA.Injector.csproj
index a100bf44..e7f5169a 100644
--- a/IPA.Injector/IPA.Injector.csproj
+++ b/IPA.Injector/IPA.Injector.csproj
@@ -3,7 +3,7 @@
- net461;net35
+ net461IPA.Injectortrue
@@ -56,6 +56,14 @@
Always
+
+
+
+ Libraries\Thirdparty\%(Filename)%(Extension)
+ Always
+
+
+
Libraries\Mono\I18N.dll
diff --git a/IPA.Injector/Properties/AssemblyInfo.cs b/IPA.Injector/Properties/AssemblyInfo.cs
index 5f18531f..2ed6471c 100644
--- a/IPA.Injector/Properties/AssemblyInfo.cs
+++ b/IPA.Injector/Properties/AssemblyInfo.cs
@@ -1,4 +1,5 @@
-using System.Reflection;
+using System;
+using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
@@ -18,6 +19,7 @@ using System.Runtime.InteropServices;
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
+[assembly: CLSCompliant(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("2a1af16b-27f1-46e0-9a95-181516bc1cb7")]
diff --git a/IPA.Loader/IPA.Loader.csproj b/IPA.Loader/IPA.Loader.csproj
index c14a9de5..bd4d4609 100644
--- a/IPA.Loader/IPA.Loader.csproj
+++ b/IPA.Loader/IPA.Loader.csproj
@@ -3,7 +3,7 @@
- net461;net35
+ net461IPAtrue
diff --git a/Libs/thirdparty/Hive.Versioning.dll b/Libs/thirdparty/Hive.Versioning.dll
new file mode 100644
index 00000000..93ed807e
Binary files /dev/null and b/Libs/thirdparty/Hive.Versioning.dll differ
diff --git a/Libs/thirdparty/Hive.Versioning.pdb b/Libs/thirdparty/Hive.Versioning.pdb
new file mode 100644
index 00000000..846207fb
Binary files /dev/null and b/Libs/thirdparty/Hive.Versioning.pdb differ
diff --git a/Libs/thirdparty/Hive.Versioning.xml b/Libs/thirdparty/Hive.Versioning.xml
new file mode 100644
index 00000000..8143d72c
--- /dev/null
+++ b/Libs/thirdparty/Hive.Versioning.xml
@@ -0,0 +1,780 @@
+
+
+
+ Hive.Versioning
+
+
+
+
+ A version that meets the Semantic Versioning specification.
+
+
+
+
+ Gets the zero version (0.0.0).
+
+
+
+
+ Parses and creates a version object from a sequence of characters.
+
+
+ This is roughly equivalent to .
+
+ The sequence of characters to parse as a version.
+ Thrown when the input is not a valid SemVer version.
+
+
+
+ Creates a version object from the component parts of the version.
+
+ The major version number.
+ The minor version number.
+ The patch number.
+ A sequence of IDs specifying the prerelease.
+ A sequence of IDs representing the build.
+
+
+
+ Creates a version object from the component parts of the version.
+
+
+ This interface is provided only for CLS compliance. The actual version number is unsigned.
+ Because of this, very large version numbers may cause issues with this interface.
+
+ The major version number.
+ The minor version number.
+ The patch number.
+ A sequence of IDs specifying the prerelease.
+ A sequence of IDs representing the build.
+
+
+
+ Creates a version object from the component parts of the version.
+
+ The major version number.
+ The minor version number.
+ The patch number.
+
+
+
+ Creates a version object from the component parts of the version.
+
+
+ This interface is provided only for CLS compliance. The actual version number is unsigned.
+ Because of this, very large version numbers may cause issues with this interface.
+
+ The major version number.
+ The minor version number.
+ The patch number.
+
+
+
+ Gets the major version number.
+
+
+
+
+ Gets the minor version number.
+
+
+
+
+ Gets the patch number.
+
+
+
+
+ Gets the sequence of prerelease IDs.
+
+
+
+
+ Gets the sequence of build IDs.
+
+
+
+
+ Vers the version number, as signed integers.
+
+
+ This interface is provided only for CLS compliance. The actual version number is unsigned.
+ Because of this, very large version numbers may cause issues with this interface.
+
+ The major version number.
+ The minor version number.
+ The patch number.
+
+
+
+ Appends this to the provided .
+
+ The to append to.
+ The provided
+
+
+
+
+
+
+ Compares two versions for equality.
+
+ The first version to compare.
+ The second version to compare.
+ if they are equal, otherwise.
+
+
+
+ Compares two versions for inequality.
+
+ The first version to compare.
+ The second version to compare.
+ if they are not equal, otherwise.
+
+
+
+ Checks if is greater than .
+
+ The first version to compare.
+ The second version to compare.
+ if is greater than ,
+
+
+
+ Checks if is less than .
+
+ The first version to compare.
+ The second version to compare.
+ if is less than ,
+
+
+
+ Checks if is greater than or equal to .
+
+ The first version to compare.
+ The second version to compare.
+ if is greater than or equal to ,
+
+
+
+ Checks if is less than or equal to .
+
+ The first version to compare.
+ The second version to compare.
+ if is less than or equal to ,
+
+
+
+ Determines the maximum of two versions.
+
+ The first version.
+ The second version.
+ The maximum of and
+
+
+
+ Determines the minimum of two versions.
+
+ The first version.
+ The second version.
+ The minimum of and
+
+
+
+ Compares version to for equality.
+
+ The object to compare to.
+ if they are equal, otherwise.
+
+
+
+ Gets the hash code of this .
+
+ The hash code for this .
+
+
+
+ Compares this version to another version according to the SemVer specification.
+
+ The version to compare to.
+ if the versions are equal, otherwise.
+
+
+
+ Compares this version to another version according to the SemVer specification.
+
+ The version to compare to.
+ Less than zero if is less than , zero if they are equal, and
+ more than zero if is greater than
+
+
+
+ Parses a sequence of characters into a object.
+
+ The sequence of characters to parse.
+ The parsed version object.
+ Thrown when is not a valid SemVer version.
+
+
+
+ Attempts to parse a sequence of characters into a version object.
+
+ The sequence of characters to parse.
+ The parsed version, if the input is valid.
+ if the text is valid and could be parsed, otherwise.
+
+
+
+ Attempts to parse a sequence of characters into a version object, as part of a larger parse.
+
+
+ When this method returns, will begin after the end of the parsed version, if it is present, or
+ what it initially contained if no version is present and this returns
+
+ The sequence of characters to parse.
+ The parsed version, if the input is valid.
+ if the text is valid and could be parsed, otherwise.
+
+
+
+ An arbitrary range of s, capable of matching any possible set of s.
+
+
+
+
+ A is considered matching if it is exactly equivalent to this one, in addition to if its comparison
+ value matches.
+
+
+
+
+ Converts this to an equivalent .
+
+
+ The returned always takes the form >=Version <=Version.
+
+ The that is equivalent to this
+
+
+
+ Inverts this into either another or a .
+
+
+ The only time this produces a is when is .
+
+ The inverted , if any.
+ The representing this inverted, if any.
+ if this produces a , or
+ if it produces a .
+
+
+
+ Tries to perform a logical conjunction (and) with .
+
+
+ This method will only return one of the following values:
+
+
+
+ A single was produced, and was set.
+
+
+
+ A single was produced, and was set.
+
+
+
+ The conjunction result matches no possible values.
+
+
+
+ The other to try to perform conjunction with.
+ The single the operation produced, if any.
+ The single the operation produced, if any.
+ A indicating which of the outputs were set, if any.
+
+
+
+ A part of the implementation of that handles
+ the cases where exactly one of the inputs are an comparer.
+
+
+
+
+ Tries to perform a logical disjunction (or) with .
+
+
+ This method will only return one of the following values:
+
+
+
+ A single was produced, and was set.
+
+
+
+ A single was produced, and was set.
+
+
+
+ The disjunction result matches every valid value. For convenience,
+ is set to .
+
+
+
+ The disjunction result is not representable with only a and a .
+ For example, if the inputs are non-equal comparers, this will be returned.
+
+
+
+ The other to try to perform disjunction with.
+ The single the operation produced, if any.
+ The single the operation produced, if any.
+ A indicating which of the outputs were set, if any.
+
+
+
+ A part of the implementation of that handles
+ the cases where exactly one of the inputs are an comparer.
+
+
+
+
+ This is identical to except that it uses
+ instead of .
+
+
+
+
+ Tries to perform a logical conjunction (and) with .
+
+
+ This method will only return one of the following values:
+
+
+
+ A single was produced, and was set.
+
+
+
+ Two s were produced, and both and were set.
+
+
+
+ The conjunction result matches no valid values.
+
+
+
+ The other to try to perform conjunction with.
+ The single (or first) the operation produced, if any.
+ The second the operation produced, if any.
+ A indicating which of the outputs were set, if any.
+
+
+
+ A part of the implementation of , handling the cases where exactly one
+ input is an inward-facing .
+
+
+
+
+ Tries to perform a logical disjunction (or) with .
+
+
+ This method will only return one of the following values:
+
+
+
+ A single was produced, and was set.
+
+
+
+ Two s were produced, and both and were set.
+
+
+
+ The disjunction result matches every valid value. For convenience,
+ is set to .
+
+
+
+ The other to try to perform disjunction with.
+ The single (or first) the operation produced, if any.
+ The second the operation produced, if any.
+ A indicating which of the outputs were set, if any.
+
+
+
+ A part of the implementation of , handling the cases where exactly one
+ input is an inward-facing .
+
+
+
+
+ Checks if two s are mutually exclusive, but meet exactly leaving no versions that neither matches.
+
+
+
+
+ Constructs a new that corresponds to the text provided in .
+
+ The textual represenation of the to create.
+
+ Thrown when is not a valid .
+
+
+
+ Creates a which matches only the provided .
+
+ The to match.
+ A matching only the provided .
+
+
+
+ Computes the logical disjunction (or) of this and .
+
+ The other to compute the disjunction of.
+ The logical disjunction of and .
+
+
+
+
+ Computes the logical disjunction (or) of the two arguments.
+
+ The first argument.
+ The second argument.
+ The logical disjunction of and .
+
+
+
+
+ Computes the logical conjunction (and) of this and .
+
+ The other to compute the conjunction of.
+ The logical conjunction of and .
+
+
+
+
+ Computes the logical conjunction (and) of the two arguments.
+
+ The first argument.
+ The second argument.
+ The logical disjunction of and .
+
+
+
+
+ Gets the compliement of this .
+
+ The compliement of this .
+
+
+
+
+ Computes the compliment of the argument.
+
+ The to compute the compliment of.
+ The compliment of .
+
+
+
+
+ Determines whether or not a given matches this .
+
+ The to check.
+ if matches, otherwise.
+
+
+
+ The that matches all s.
+
+
+
+
+ The that matches no s.
+
+
+
+
+ Appends the string representation of this to the provided .
+
+ The to append to.
+ The that was appended to.
+
+
+
+ Gets the string representation of this .
+
+ The string representation of this .
+
+
+
+
+
+
+ Determines whether this is equivalent to another range.
+
+ The to compare to.
+ if they are equivalent, otherwise.
+
+
+
+
+
+
+ Compares two s for equality.
+
+ The first argument.
+ The second argument.
+ if and are equivalent, otherwise.
+
+
+
+ Determines if two s are not equivalent.
+
+ The first argument.
+ The second argument.
+ if and are not equivalent, otherwise.
+
+
+
+ Parses a string as a .
+
+
+
+ A valid string is made up of a set of disjoint regions joined by ||.
+ These regions can be either bounded or unbounded.
+ A bounded region is a pair of unbounded regions separated by whitespace, such that both unbounded regions overlap,
+ and the unbounded region whose written value is lower comes first.
+ An unbounded region is any valid prefixed with one of the following comparison operators:
+
+
+ >=
+ The unbounded range matches any greater than or equal to its specified .
+
+
+ <=
+ The unbounded range matches any less than or equal to its specified .
+
+
+ >
+ The unbounded range matches any greater than its specified .
+
+
+ <
+ The unbounded range matches any less than its specified .
+
+
+ =
+ The range matches only the that it is specified with.
+
+ Note that unbounded ranges using the = comparison operator cannot be part of a bounded region.Additionally, there are the following shorthand comparison operators that expand to bounded regions:
+
+ ^
+
+ The bounded range matches all versions greater than or equal to its specified and less than the next major incremented
+ version. For example, ^1.5.4 would be equivalent to the bounded range >=1.5.4 <2.0.0, while ^0.4.2 would be equivalent
+ to >=0.4.2 <0.5.0.
+
+
+
+
+ The stirng to parse.
+ The parsed .
+
+ Thrown when is not a valid .
+
+
+
+ Attempts to parse a whole string as a .
+
+
+
+ A valid string is made up of a set of disjoint regions joined by ||.
+ These regions can be either bounded or unbounded.
+ A bounded region is a pair of unbounded regions separated by whitespace, such that both unbounded regions overlap,
+ and the unbounded region whose written value is lower comes first.
+ An unbounded region is any valid prefixed with one of the following comparison operators:
+
+
+ >=
+ The unbounded range matches any greater than or equal to its specified .
+
+
+ <=
+ The unbounded range matches any less than or equal to its specified .
+
+
+ >
+ The unbounded range matches any greater than its specified .
+
+
+ <
+ The unbounded range matches any less than its specified .
+
+
+ =
+ The range matches only the that it is specified with.
+
+ Note that unbounded ranges using the = comparison operator cannot be part of a bounded region.Additionally, there are the following shorthand comparison operators that expand to bounded regions:
+
+ ^
+
+ The bounded range matches all versions greater than or equal to its specified and less than the next major incremented
+ version. For example, ^1.5.4 would be equivalent to the bounded range >=1.5.4 <2.0.0, while ^0.4.2 would be equivalent
+ to >=0.4.2 <0.5.0.
+
+
+
+
+ The string to try to parse.
+ The parsed , if any.
+ if was successfully parsed, otherwise.
+
+
+
+
+ Attempts to parse a from the start of the string.
+
+
+ When this returns , will begin immediately after the parsed .
+ When this returns , will remain unchanged.
+
+ A valid string is made up of a set of disjoint regions joined by ||.
+ These regions can be either bounded or unbounded.
+ A bounded region is a pair of unbounded regions separated by whitespace, such that both unbounded regions overlap,
+ and the unbounded region whose written value is lower comes first.
+ An unbounded region is any valid prefixed with one of the following comparison operators:
+
+
+ >=
+ The unbounded range matches any greater than or equal to its specified .
+
+
+ <=
+ The unbounded range matches any less than or equal to its specified .
+
+
+ >
+ The unbounded range matches any greater than its specified .
+
+
+ <
+ The unbounded range matches any less than its specified .
+
+
+ =
+ The range matches only the that it is specified with.
+
+ Note that unbounded ranges using the = comparison operator cannot be part of a bounded region.Additionally, there are the following shorthand comparison operators that expand to bounded regions:
+
+ ^
+
+ The bounded range matches all versions greater than or equal to its specified and less than the next major incremented
+ version. For example, ^1.5.4 would be equivalent to the bounded range >=1.5.4 <2.0.0, while ^0.4.2 would be equivalent
+ to >=0.4.2 <0.5.0.
+
+
+
+
+ The string to try to parse.
+ The parsed , if any.
+ if was successfully parsed, otherwise.
+
+
+
+ Returns the cached ResourceManager instance used by this class.
+
+
+
+
+ Overrides the current thread's CurrentUICulture property for all
+ resource lookups using this strongly typed resource class.
+
+
+
+
+ Gets a resource string for AssertionFailed similar to ''.
+
+
+
+
+ Gets a resource string for Range_InputInvalid similar to 'Input is not a valid VersionRange'.
+
+
+
+
+ Gets a resource string for Version_InputInvalid similar to 'Input was not a valid SemVer version'.
+
+
+
+
+ Gets a resource string for Version_InputTooShort similar to 'Input too short to be a SemVer version'.
+
+
+
+
+ Specifies that when a method returns ,
+ the parameter may be even if the corresponding type disallows it.
+
+
+
+
+ Initializes the attribute with the specified return value condition.
+
+ The return value condition. If the method returns this
+ value, the associated parameter may be null.
+
+
+
+ Gets the return value condition.
+
+ The return value condition. If the method returns this value, the
+ associated parameter may be null.
+
+
+
+ Specifies that when a method returns ,
+ the parameter is not even if the corresponding type allows it.
+
+
+
+
+ Initializes the attribute with the specified return value condition.
+
+ The return value condition. If the method returns this
+ value, the associated parameter is not null.
+
+
+
+ Gets the return value condition.
+
+ The return value condition. If the method returns this value, the
+ associated parameter is not null.
+
+
+
+ Specifies that an output may be even if the corresponding type disallows it.
+
+
+
+
+ Specifies that the method will not return if the associated Boolean parameter is passed the specified value.
+
+
+
+
+ Initializes the attribute with the specified parameter value.
+
+
+ The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to
+ the associated parameter matches this value.
+
+
+
+
+ Gets the condition parameter value.
+
+
+
+