diff --git a/.gitignore b/.gitignore index 688980b..39a91ef 100644 --- a/.gitignore +++ b/.gitignore @@ -1,81 +1,14 @@ -# -------------------------------------------------------------------------------------------------- -# Core Visual Studio / .NET build outputs -# -------------------------------------------------------------------------------------------------- -bin/ -obj/ -[Bb]uild/ -[Dd]ebug*/ -[Rr]elease*/ -x64/ -x86/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -_ReSharper.*/ -*.user -*.userosscache -*.suo -*.cache -*.pdb -*.mpdb -*.opendb -*.VC.db -*.vscode/ - -# -------------------------------------------------------------------------------------------------- -# Package artefacts (NuGet, npm, etc.) -# -------------------------------------------------------------------------------------------------- -/packages/ -*.nupkg -*.snupkg -*.nuspec -package-lock.json -packages.config -npm-debug.log* -yarn-error.log - -# -------------------------------------------------------------------------------------------------- -# TFS / TFVC specific files and folders -# -------------------------------------------------------------------------------------------------- -$tf/ -*$tf/ -*.tf -*.tfs -.tfignore - -# -------------------------------------------------------------------------------------------------- -# IDE tooling and workspace settings -# -------------------------------------------------------------------------------------------------- -.vs/ -.vscode/ -*.swp -*.sln.docstates -*.VC.VC.opendb -.idea/ -.DS_Store -Thumbs.db - -# -------------------------------------------------------------------------------------------------- -# Test results and profiling data -# -------------------------------------------------------------------------------------------------- -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* -*.trx -*.coverage -*.coveragexml -*.opencover.xml -*.dotCover -BenchmarkDotNet.Artifacts/ - -# -------------------------------------------------------------------------------------------------- -# Miscellaneous recommended ignores -# -------------------------------------------------------------------------------------------------- -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -*.tmp -*.temp -*.log -*.bak -*.orig -*.scc - +bin/ +obj/ +.vs/ +*.user +packages/ +F4SDHelper/packages.config +F4SDM42WebApi/packages.config +F4SDM42WebApi/BasePackage/Assemblies/ +F4SDM42WebApi/Root/InstalledPackages/ +F4SDHelper/bin/ +F4SDHelper/obj/ +F4SDM42WebApi/bin/ +F4SDM42WebApi/obj/ +artifacts/ diff --git a/C4IT - F4SD - M42WebApi.sln b/C4IT - F4SD - M42WebApi.sln index e5e1f32..c0e60c0 100644 --- a/C4IT - F4SD - M42WebApi.sln +++ b/C4IT - F4SD - M42WebApi.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.5.33424.131 +# Visual Studio Version 18 +VisualStudioVersion = 18.7.11919.86 stable MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "F4SD - M42WebApi", "F4SDM42WebApi\F4SD - M42WebApi.csproj", "{D8CBFFCA-0B43-4ACC-80EA-C944E7420CEE}" EndProject @@ -47,25 +47,6 @@ Global EndGlobalSection GlobalSection(SharedMSBuildProjectFiles) = preSolution M42F4SDUUXWorkspace\M42F4SDUUXWorkspace.projitems*{c3d52a04-2461-4f35-8edf-de7226add677}*SharedItemsImports = 13 - M42F4SDUUXWorkspace\M42F4SDUUXWorkspace.projitems*{d8cbffca-0b43-4acc-80ea-c944e7420cee}*SharedItemsImports = 4 - EndGlobalSection - GlobalSection(TeamFoundationVersionControl) = preSolution - SccNumberOfProjects = 5 - SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} - SccTeamFoundationServer = https://consulting4it.visualstudio.com/ - SccLocalPath0 = . - SccProjectUniqueName1 = F4SDHelper\\F4SD\u0020-\u0020Helper.csproj - SccProjectName1 = F4SDHelper - SccLocalPath1 = F4SDHelper - SccProjectUniqueName2 = F4SDM42WebApi\\F4SD\u0020-\u0020M42WebApi.csproj - SccProjectName2 = F4SDM42WebApi - SccLocalPath2 = F4SDM42WebApi - SccProjectUniqueName3 = M42F4SDUUXWorkspace\\F4SD\u0020-\u0020M42\u0020UUX\u0020Workspace.shproj - SccProjectName3 = M42F4SDUUXWorkspace - SccLocalPath3 = M42F4SDUUXWorkspace - SccProjectUniqueName4 = M42F4SDUUXWorkspace\\M42F4SDUUXWorkspace.projitems - SccProjectTopLevelParentUniqueName4 = M42F4SDUUXWorkspace\\F4SD\u0020-\u0020M42\u0020UUX\u0020Workspace.shproj - SccProjectName4 = M42F4SDUUXWorkspace - SccLocalPath4 = M42F4SDUUXWorkspace + M42F4SDUUXWorkspace\M42F4SDUUXWorkspace.projitems*{d8cbffca-0b43-4acc-80ea-c944e7420cee}*SharedItemsImports = 5 EndGlobalSection EndGlobal diff --git a/F4SDHelper/F4SD - Helper.csproj b/F4SDHelper/F4SD - Helper.csproj index 5e47625..1939174 100644 --- a/F4SDHelper/F4SD - Helper.csproj +++ b/F4SDHelper/F4SD - Helper.csproj @@ -1,75 +1,34 @@ - - - + - Debug - AnyCPU - {EB95E1FB-7A9E-4894-BD28-2D0BE2715EBE} + net8.0 Library - Properties C4IT.F4SDM C4ITF4SDM42WebApiHelper - v4.7.2 - 512 - true - - SAK - SAK - SAK - SAK - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - bin\Release_and_copy\ - TRACE - true - pdbonly - AnyCPU - 7.3 - prompt + disable + disable + latestmajor + false + false + - - ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + + ..\F4SDM42WebApi\M42Libraries\26.1\Newtonsoft.Json.dll + false - - - - - - - - + + Common\C4IT.Logging.LogManager.cs + + Common\C4IT.F4SD.Base.Ticket.cs + Properties\SharedAssemblyInfo.cs - - - - - - - - \ No newline at end of file + + diff --git a/F4SDM42WebApi/BuildM42Package.ps1 b/F4SDM42WebApi/BuildM42Package.ps1 new file mode 100644 index 0000000..dab584d --- /dev/null +++ b/F4SDM42WebApi/BuildM42Package.ps1 @@ -0,0 +1,73 @@ +param( + [Parameter(Mandatory = $true)] + [string]$TemplateDir, + + [Parameter(Mandatory = $true)] + [string]$AssembliesDir, + + [Parameter(Mandatory = $true)] + [string]$OutputRoot, + + [Parameter(Mandatory = $true)] + [string]$PackageName, + + [Parameter(Mandatory = $true)] + [string]$PackageVersion +) + +$ErrorActionPreference = 'Stop' + +function Normalize-FullPath { + param([string]$Path) + return [System.IO.Path]::GetFullPath($Path) +} + +function Normalize-TextFileLineEndings { + param([string]$Path) + + $content = [System.IO.File]::ReadAllText($Path) + $content = [regex]::Replace($content, '(? + + + + + + diff --git a/F4SDM42WebApi/F4SD - M42WebApi.csproj b/F4SDM42WebApi/F4SD - M42WebApi.csproj index 4aa97e3..68192c0 100644 --- a/F4SDM42WebApi/F4SD - M42WebApi.csproj +++ b/F4SDM42WebApi/F4SD - M42WebApi.csproj @@ -1,143 +1,99 @@ - - - + - Debug - AnyCPU - {D8CBFFCA-0B43-4ACC-80EA-C944E7420CEE} + net8.0 Library - Properties C4IT.F4SDM C4ITF4SDM42WebApi - v4.7.2 - 512 - true - - SAK - SAK - SAK - SAK - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - true - bin\Debug_and_copy\ - DEBUG;TRACE - full - AnyCPU - 7.3 - prompt - - - bin\Release_and_copy\ - TRACE - true - pdbonly - AnyCPU - 7.3 - prompt + win-x64;linux-x64 + true + disable + disable + latestmajor + false + false + 6673a25d-33d6-4072-91d9-abed4be1a966 + C4ITF4SD*.* + 1.4.0.14 + true + - - False - M42Libraries\Matrix42.Common.dll + + M42Libraries\26.1\Matrix42.Common.dll + false - - False - M42Libraries\Matrix42.Contracts.Common.dll + + M42Libraries\26.1\Matrix42.Contracts.Common.dll + false - - False - M42Libraries\Matrix42.Contracts.Platform.dll + + M42Libraries\26.1\Matrix42.Contracts.Platform.dll + false - - False - M42Libraries\Matrix42.Contracts.ServiceManagement.dll + + M42Libraries\26.1\Matrix42.Contracts.ServiceManagement.dll + false - - False - M42Libraries\Matrix42.Pandora.Contracts.dll + + M42Libraries\26.1\Matrix42.Hosting.Contracts.dll + false - - False - M42Libraries\Matrix42.Services.Description.Contracts.dll + + M42Libraries\26.1\Matrix42.Configuration.Global.dll + false - - False + + M42Libraries\26.1\Matrix42.Pandora.Contracts.dll + false - - ..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll + + M42Libraries\26.1\Matrix42.Persistence.Contracts.dll + false - - - - - - False - M42Libraries\System.Web.Http.dll + + M42Libraries\26.1\Matrix42.Services.Description.Contracts.dll + false - - False - M42Libraries\System.Web.OData.dll + + M42Libraries\26.1\Matrix42.WebApi.Contracts.dll + false - - - - - - - - False - M42Libraries\update4u.SPS.DataLayer.dll + + M42Libraries\26.1\Newtonsoft.Json.dll + false - - False - M42Libraries\update4u.SPS.Utility.dll + + M42Libraries\26.1\System.Net.Http.Formatting.dll + false + + + M42Libraries\26.1\update4u.SPS.DataLayer.dll + false + + + M42Libraries\26.1\update4u.SPS.Utility.dll + false + + + + + - - Properties\SharedAssemblyInfo.cs - + + Properties\SharedAssemblyInfo.cs + + - - {eb95e1fb-7a9e-4894-bd28-2d0be2715ebe} - F4SD - Helper - True - - - - - - - + + - - - @echo powershell -ExecutionPolicy Unrestricted $(ProjectDir)deploy.ps1 -ProjectDir $(ProjectDir) -SolutionDir $(SolutionDir) -OutDir $(OutDir) -ConfigurationName $(ConfigurationName) - - \ No newline at end of file + + diff --git a/F4SDM42WebApi/F4SDHelperService.cs b/F4SDM42WebApi/F4SDHelperService.cs index 7345429..a68fa60 100644 --- a/F4SDM42WebApi/F4SDHelperService.cs +++ b/F4SDM42WebApi/F4SDHelperService.cs @@ -1,2168 +1,2761 @@ -using C4IT.F4SDM; -using C4IT.FASD.Base; -using C4IT.Logging; -using Matrix42.Common; -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.SqlClient; -using System.Dynamic; -using System.Globalization; -using System.IO; -using System.IO.Compression; -using System.Linq; -using System.Net; -using System.Net.Http; -using System.Net.Http.Headers; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using System.Web; -using update4u.SPS.DataLayer; -using update4u.SPS.DataLayer.Transaction; -using static C4IT.FASD.Base.cF4SDTicket; -using static C4IT.Logging.cLogManager; - -namespace C4IT.F4SD -{ - public class F4SDHelperService - { - private static Guid SPSUserClassBaseID = SPSDataEngineSchemaReader.ClassGetIDFromName("SPSUserClassBase"); - private static Guid SPSAccountClassBaseID = SPSDataEngineSchemaReader.ClassGetIDFromName("SPSAccountClassBase"); - private static Guid SPSCommonClassBaseID = SPSDataEngineSchemaReader.ClassGetIDFromName("SPSCommonClassBase"); - private static Guid SPSAccountClassADID = SPSDataEngineSchemaReader.ClassGetIDFromName("SPSAccountClassAD"); - private static Guid SPSActivityClassBaseID = SPSDataEngineSchemaReader.ClassGetIDFromName("SPSActivityClassBase"); - private static Guid SPSActivityClassIncidentID = SPSDataEngineSchemaReader.ClassGetIDFromName("SPSActivityClassIncident"); - private static Guid SPSActivityClassUnitOfWorkID = SPSDataEngineSchemaReader.ClassGetIDFromName("SPSActivityClassUnitOfWork"); - private static Guid SPSScCategoryClassBaseID = SPSDataEngineSchemaReader.ClassGetIDFromName("SPSScCategoryClassBase"); - private static Guid SPSAssetClassBaseID = SPSDataEngineSchemaReader.ClassGetIDFromName("SPSAssetClassBase"); - private static Guid SPSSecurityClassRole = SPSDataEngineSchemaReader.ClassGetIDFromName("SPSSecurityClassRole"); - - public static readonly Guid Administrators = new Guid("{A5D7B682-B211-4D94-A96D-8C57EEDAFDEA}"); - - private const string TicketCloseActionId = "51bb3283-7bd1-e511-9a82-60e327035d31"; - private const string TicketDirectLinkCreateTemplate = @"{0}/wm/app-ServiceDesk/notSet/create-object/{1}?view-options=%7B%22embedded%22:false%7D&presetParams={2}"; - private const string IncidentDirectLinkCloseTemplate = @"{0}/wm/app-ServiceDesk/notSet/preview-object/SPSActivityTypeIncident/{1}/0/?view-options={2}"; - private const string TicketDirectLinkPreviewTemplate = @"{0}/wm/app-ServiceDesk/notSet/preview-object/{1}/{2}/0/"; - private const string TicketDirectLinkEditTemplate = @"{0}/wm/app-ServiceDesk/notSet/edit-object/{1}/{2}"; - - private const string placeHolderSubject = "PARAM_SUBJECT"; - private const string placeHolderDescription = "PARAM_DESCRIPTION"; - private const string c4itf4sdmonLinkBase = "f4sdsend://localhost"; - - private const string F4SDTicketTableName = "M42WPM-TICKETS-INFOS"; - private const string F4SDTicketStatusColumnName = "STATUS"; - - - public static IEnumerable ReadLines(Func streamProvider, - Encoding encoding) - { - using (var stream = streamProvider()) - using (var reader = new StreamReader(stream, encoding)) - { - string line; - while ((line = reader.ReadLine()) != null) - { - yield return line; - } - } - } - - internal async Task getDirectLinkF4SD(Guid EOID, string type) - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - try - { - LogEntry($"Generating F4SD URI for type: '{type}', GUID: '{EOID}'", LogLevels.Debug); - var builder = new UriBuilder(c4itf4sdmonLinkBase); - var queryString = HttpUtility.ParseQueryString(builder.Query); - - switch (type.ToLowerInvariant().Split('.').Last()) - { - case "person": - case "user": - var user = getUsersByAsql($"[Expression-ObjectId]='{EOID}'")?.FirstOrDefault(); - string Sids = string.Empty; - - if (user != null) - { - var accounts = getAccountsByAsql($"Owner='{user.Id}'"); - Sids = string.Join(",", accounts?.Where(x => !string.IsNullOrEmpty(x.Sid)).Select(x => x.Sid) ?? Array.Empty()); - } - - if (!string.IsNullOrEmpty(user?.Name)) - { - queryString.Add("command", "UserSidSearch"); - queryString.Add("name", user.Name); - queryString.Add("sids", Sids); - } - break; - - case "asset": - var asset = getAssetsByAsql($"UsedInTypeSPSComputerType is not null AND [Expression-ObjectId]='{EOID}'")?.FirstOrDefault(); - if (asset != null) - { - queryString.Add("command", "ComputerDomainSearch"); - queryString.Add("name", asset.Name); - queryString.Add("domain", asset.DomainName); - } - break; - - case "incident": - case "servicerequest": - case "ticket": - var ticket = (await getTicketDetails(new List { EOID }))?.FirstOrDefault(); - if (ticket != null) - { - queryString.Add("command", "TicketSearch"); - queryString.Add("tname", ticket.Name); - queryString.Add("tid", ticket.TicketObjectId.ToString()); - - if (ticket.AffectedUserId != Guid.Empty) - { - var initiator = getUsersByAsql($"ID = '{ticket.AffectedUserId}'")?.FirstOrDefault(); - string userName = initiator?.Name; - Sids = string.Join(",", getAccountsByAsql($"Owner='{ticket.AffectedUserId}'")?.Where(x => !string.IsNullOrEmpty(x.Sid)).Select(x => x.Sid) ?? Array.Empty()); - - queryString.Add("uname", userName); - queryString.Add("sids", Sids); - } - } - break; - - default: - break; - } - - builder.Query = queryString.ToString(); - return string.IsNullOrEmpty(builder.Query) ? null : builder.ToString(); - } - catch (Exception E) - { - LogException(E); - return null; - } - finally - { - LogMethodEnd(CM); - } - } - - - internal async Task> getTicketListByUser(string userSid, int hours, int queueoption, List queues) - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - try - { - LogEntry($"Generating ticket list for userSid: '{userSid}', {hours} hours", LogLevels.Debug); - await Task.Delay(0); - - var tickets = new List(); - var activityFilter = GetActivityFilter(userSid, hours, ticketAndServiceRequestEnabled(), queueoption, queues); - LogEntry($"ASql Filter: {activityFilter}"); - - var activityTable = FragmentRequestBase.SimpleLoad(SPSActivityClassBaseID, - string.Format("[Expression-ObjectID] as EOID, TicketNumber, Subject, Service.ID as ServiceId, Service.Name as ServiceName, SUBQUERY(BasicSchemaObjectType as bso, bso.Name, bso.id = base.T(SPSCommonClassBase).TypeID) as ActivityType" + - ", COALESCE(T(SPSActivityClassIncident).Asset.T(SPSComputerClassBase).Name, T(SPSActivityClassIncident).Asset.T(SPSAssetClassSIMCard).PhoneNumber, T(SPSActivityClassIncident).Asset.Name, T(SPSActivityClassIncident).Asset.objectid) as AssetName" + - ", SUBQUERY(BasicSchemaObjectType AS t, t.Name, t.ID=base.T(SPSActivityClassIncident).Asset.T(SPSCommonClassBase).TypeID) as AssetCIName" + - ", CASE WHEN Initiator.PrimaryAccount.T(SPSAccountClassAd).Sid = '{0}' THEN 1 ELSE 0 END AS IsPrimaryAccount", - userSid), - activityFilter); - - if (activityTable?.Rows == null || activityTable.Rows.Count == 0) - { - LogEntry($"No activity entries found for userSid: '{userSid}'", LogLevels.Warning); - return null; - } - - for (int i = 0; i < activityTable.Rows.Count; i++) - { - DataRow entry = activityTable.Rows[i]; - var activityEOId = getGuidFromObject(entry["EOID"]); - var ticketNumber = getStringFromObject(entry["TicketNumber"]); - var activityType = getStringFromObject(entry["ActivityType"]); - var assetName = getStringFromObject(entry["AssetName"]); - var ServiceName = getStringFromObject(entry["ServiceName"]); - var assetCIName = getStringFromObject(entry["AssetCIName"]); - var subject = getStringFromObject(entry["Subject"]); - - var stateData = GetActivityState(activityEOId); - var state = stateData.Item1; - var stateDisp = stateData.Item2; - - LogEntry($"Activity found {i + 1}/{activityTable.Rows.Count}: ObjectID={activityEOId}, TicketNumber={ticketNumber}, Subject={subject}, State={state}", LogLevels.Debug); - - if (string.IsNullOrEmpty(ticketNumber)) - { - LogEntry($"No TicketNumber found for activity entry", LogLevels.Warning); - continue; - } - - if (string.IsNullOrEmpty(assetName)) - { - LogEntry($"No AssetName found for activity entry", LogLevels.Debug); - } - - if (string.IsNullOrEmpty(assetCIName)) - { - LogEntry($"No AssetCIName found for activity entry", LogLevels.Debug); - } - var ServiceId = getGuidFromObject(entry["ServiceId"]); - if (ServiceId == Guid.Empty) - { - LogEntry($"no ServiceId found for activity entry", LogLevels.Debug); - } - var AssetCIName = getStringFromObject(entry["AssetCIName"]); - if (AssetCIName == string.Empty) - { - LogEntry($"no AssetCIName found for activity entry", LogLevels.Debug); - } - var Subject = getStringFromObject(entry["Subject"]); - if (Subject == string.Empty) - { - LogEntry($"no Subject found for activity entry", LogLevels.Warning); - continue; - } - var IsPrimaryAccount = getIntFromObject(entry["IsPrimaryAccount"]); - - if (string.IsNullOrEmpty(subject)) - { - LogEntry($"No Subject found for activity entry", LogLevels.Warning); - continue; - } - - tickets.Add(new cF4SDTicketSummary() - { - TicketObjectId = activityEOId, - Name = ticketNumber, - ActivityType = activityType, - AssetCIName = assetCIName, - AssetName = assetName, - ServiceId = ServiceId, - ServiceName = ServiceName, - StatusId = state, - Status = stateDisp, - Summary = subject, - IsPrimaryAccount = IsPrimaryAccount == 1 - }); - } - - tickets = tickets.OrderByDescending(x => x.Name).ToList(); - return tickets; - } - catch (Exception E) - { - LogException(E); - return null; - } - finally - { - LogMethodEnd(CM); - } - } - - private static readonly string[] TicketOverviewKeys = new[] - { - "TicketsNew", - "TicketsActive", - "TicketsCritical", - "TicketsNewInfo", - "IncidentNew", - "IncidentActive", - "IncidentCritical", - "IncidentNewInfo", - "UnassignedTickets", - "UnassignedTicketsCritical" - }; - - public class TicketOverviewCountsResult - { - [JsonProperty("counts")] - public Dictionary Counts { get; set; } = new Dictionary(StringComparer.OrdinalIgnoreCase); - } - - public class TicketOverviewCountsByRoleResult - { - [JsonProperty("generatedAtUtc")] - public DateTime GeneratedAtUtc { get; set; } = DateTime.UtcNow; - - [JsonProperty("countsByRole")] - public Dictionary> CountsByRole { get; set; } - = new Dictionary>(StringComparer.OrdinalIgnoreCase); - } - - public class TicketOverviewRelationDto - { - public enumF4sdSearchResultClass Type { get; set; } - public string Name { get; set; } - public string DisplayName { get; set; } - public Guid id { get; set; } - public enumF4sdSearchResultStatus Status { get; set; } = enumF4sdSearchResultStatus.Unknown; - public Dictionary Infos { get; set; } = null; - public List Identities { get; set; } = null; - } - - private sealed class TicketOverviewEntry - { - public Guid TicketId { get; set; } - public string TicketNumber { get; set; } - public string Summary { get; set; } - public Guid InitiatorId { get; set; } - public string InitiatorDisplayName { get; set; } - public string InitiatorAccount { get; set; } - public string InitiatorDomain { get; set; } - public string InitiatorSid { get; set; } - public Guid RecipientId { get; set; } - public Guid RecipientRoleId { get; set; } - public int State { get; set; } - public DateTime CreatedDate { get; set; } - public bool NewInformationReceived { get; set; } - public bool ReactionTimeEscalated { get; set; } - public bool SolutionTimeEscalated { get; set; } - public bool IsIncident { get; set; } - public string ActivityType { get; set; } - } - - internal async Task getTicketOverviewCounts( - string sid, - string scope, - IEnumerable keys, - int queueoption, - List queues) - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - try - { - var useRoleScope = string.Equals(scope, "role", StringComparison.OrdinalIgnoreCase); - var normalizedKeys = (keys ?? Array.Empty()) - .Where(k => !string.IsNullOrWhiteSpace(k)) - .Distinct(StringComparer.OrdinalIgnoreCase) - .ToList(); - - if (normalizedKeys.Count == 0) - { - normalizedKeys.AddRange(TicketOverviewKeys); - } - - var entries = await LoadTicketOverviewEntries(sid, useRoleScope, queueoption, queues); - List unassignedEntries = null; - if (!useRoleScope && normalizedKeys.Any(IsUnassignedOverviewKey)) - { - unassignedEntries = await LoadTicketOverviewUnassignedEntriesForPersonalScope(sid, queueoption, queues); - } - - var counts = new Dictionary(StringComparer.OrdinalIgnoreCase); - - foreach (var key in normalizedKeys) - { - if (!useRoleScope && IsUnassignedOverviewKey(key)) - { - counts[key] = (unassignedEntries ?? new List()) - .Count(entry => MatchesTicketOverviewKey(entry, key)); - } - else - { - counts[key] = entries.Count(entry => MatchesTicketOverviewKey(entry, key)); - } - } - - return new TicketOverviewCountsResult { Counts = counts }; - } - catch (Exception E) - { - LogException(E); - return new TicketOverviewCountsResult(); - } - finally - { - LogMethodEnd(CM); - } - } - - internal async Task getTicketOverviewCountsByRoles( - string sid, - IEnumerable roleGuids, - IEnumerable keys, - int queueoption, - List queues) - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - try - { - var normalizedKeys = (keys ?? Array.Empty()) - .Where(k => !string.IsNullOrWhiteSpace(k)) - .Distinct(StringComparer.OrdinalIgnoreCase) - .ToList(); - - if (normalizedKeys.Count == 0) - { - normalizedKeys.AddRange(TicketOverviewKeys); - } - - var roleIds = await ResolveTicketOverviewRoleIdsAsync(sid, roleGuids); - if (roleIds.Count == 0) - return new TicketOverviewCountsByRoleResult(); - - var entries = await LoadTicketOverviewEntriesByRoleIds(roleIds, queueoption, queues); - var entriesByRole = entries - .GroupBy(entry => entry.RecipientRoleId) - .ToDictionary(group => group.Key, group => group.ToList()); - - var countsByRole = new Dictionary>(StringComparer.OrdinalIgnoreCase); - foreach (var roleId in roleIds) - { - var roleEntries = entriesByRole.TryGetValue(roleId, out var list) - ? list - : new List(); - - var counts = new Dictionary(StringComparer.OrdinalIgnoreCase); - foreach (var key in normalizedKeys) - { - counts[key] = roleEntries.Count(entry => MatchesTicketOverviewKey(entry, key)); - } - - countsByRole[roleId.ToString()] = counts; - } - - return new TicketOverviewCountsByRoleResult - { - GeneratedAtUtc = DateTime.UtcNow, - CountsByRole = countsByRole - }; - } - catch (Exception E) - { - LogException(E); - return new TicketOverviewCountsByRoleResult(); - } - finally - { - LogMethodEnd(CM); - } - } - - internal async Task> getTicketOverviewRelations( - string sid, - string scope, - string key, - int count, - int queueoption, - List queues) - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - try - { - if (string.IsNullOrWhiteSpace(key)) - return new List(); - - var useRoleScope = string.Equals(scope, "role", StringComparison.OrdinalIgnoreCase); - List entries; - if (!useRoleScope && IsUnassignedOverviewKey(key)) - { - entries = await LoadTicketOverviewUnassignedEntriesForPersonalScope(sid, queueoption, queues); - } - else - { - entries = await LoadTicketOverviewEntries(sid, useRoleScope, queueoption, queues); - } - - var filtered = entries - .Where(entry => MatchesTicketOverviewKey(entry, key)) - .OrderByDescending(entry => entry.CreatedDate) - .ToList(); - - if (count > 0) - filtered = filtered.Take(count).ToList(); - - var relations = new List(filtered.Count); - foreach (var entry in filtered) - { - var relation = new TicketOverviewRelationDto - { - Type = enumF4sdSearchResultClass.Ticket, - DisplayName = entry.TicketNumber ?? string.Empty, - Name = entry.TicketNumber ?? string.Empty, - id = entry.TicketId, - Status = enumF4sdSearchResultStatus.Active, - Infos = new Dictionary - { - ["Summary"] = entry.Summary ?? string.Empty, - ["StatusId"] = ConvertM42State(entry.State), - ["ActivityType"] = entry.ActivityType ?? string.Empty, - ["UserDisplayName"] = entry.InitiatorDisplayName ?? string.Empty, - ["UserAccount"] = entry.InitiatorAccount ?? string.Empty, - ["UserDomain"] = entry.InitiatorDomain ?? string.Empty, - ["UserSid"] = entry.InitiatorSid ?? string.Empty, - ["Sids"] = entry.InitiatorSid ?? string.Empty, - ["UserId"] = entry.InitiatorId != Guid.Empty ? entry.InitiatorId.ToString() : string.Empty, - ["UserGuid"] = entry.InitiatorId != Guid.Empty ? entry.InitiatorId.ToString() : string.Empty - }, - Identities = new List - { - new cF4sdIdentityEntry { Class = enumFasdInformationClass.Ticket, Id = entry.TicketId }, - new cF4sdIdentityEntry { Class = enumFasdInformationClass.User, Id = entry.InitiatorId } - } - }; - relations.Add(relation); - } - - return relations; - } - catch (Exception E) - { - LogException(E); - return new List(); - } - finally - { - LogMethodEnd(CM); - } - } - - private async Task> LoadTicketOverviewEntries( - string sid, - bool useRoleScope, - int queueoption, - List queues) - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - try - { - await Task.Delay(0); - - if (string.IsNullOrWhiteSpace(sid)) - return new List(); - - var filter = await BuildTicketOverviewFilterAsync(sid, useRoleScope, queueoption, queues); - return await LoadTicketOverviewEntriesByFilter(filter); - } - catch (Exception E) - { - LogException(E); - return new List(); - } - finally - { - LogMethodEnd(CM); - } - } - - private async Task> LoadTicketOverviewUnassignedEntriesForPersonalScope( - string sid, - int queueoption, - List queues) - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - try - { - await Task.Delay(0); - - if (string.IsNullOrWhiteSpace(sid)) - return new List(); - - var roleIds = await ResolveTicketOverviewRoleIdsAsync(sid, null); - var filter = BuildTicketOverviewFilterForRoleIds(roleIds, null, queueoption, queues); - if (string.IsNullOrWhiteSpace(filter)) - return new List(); - - filter += " AND Recipient IS NULL"; - return await LoadTicketOverviewEntriesByFilter(filter); - } - catch (Exception E) - { - LogException(E); - return new List(); - } - finally - { - LogMethodEnd(CM); - } - } - - private async Task> LoadTicketOverviewEntriesByRoleIds( - IEnumerable roleIds, - int queueoption, - List queues) - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - try - { - await Task.Delay(0); - - var filter = BuildTicketOverviewFilterForRoleIds(roleIds, null, queueoption, queues); - return await LoadTicketOverviewEntriesByFilter(filter); - } - catch (Exception E) - { - LogException(E); - return new List(); - } - finally - { - LogMethodEnd(CM); - } - } - - private async Task> LoadTicketOverviewEntriesByFilter(string filter) - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - try - { - await Task.Delay(0); - - if (string.IsNullOrWhiteSpace(filter)) - return new List(); - - var tbl = FragmentRequestBase.SimpleLoad(SPSActivityClassBaseID, - "[Expression-ObjectID] as EOID" + - ", TicketNumber" + - ", Subject" + - ", Initiator as InitiatorId" + - ", Initiator.LastName + ISNULL(', ' + Initiator.FirstName, '') as Initiator" + - ", Initiator.PrimaryAccount.T(SPSAccountClassAD).NBAccountName as InitiatorAccount" + - ", Initiator.PrimaryAccount.T(SPSAccountClassAD).Domain.NT4Name as InitiatorDomain" + - ", Initiator.PrimaryAccount.T(SPSAccountClassAD).Sid as InitiatorSid" + - ", Recipient as RecipientId" + - ", RecipientRole.T(SPSSecurityClassRole).ID as RecipientRoleId" + - ", T(SPSCommonClassBase).State as State" + - ", CreatedDate" + - ", NewInformationReceived" + - ", ReactionTimeEscalated" + - ", SolutionTimeEscalated" + - ", UsedInTypeSPSActivityTypeTicket as TicketEoid" + - ", UsedInTypeSPSActivityTypeIncident as IncidentEoid" + - ", UsedInTypeSPSActivityTypeAlert as AlertEoid" + - ", UsedInTypeSPSActivityTypeGroupTicket as ProblemEoid" + - ", UsedInTypeSPSActivityTypeServiceRequest as ServiceRequestEoid" + - ", UsedInTypeSPSActivityTypeBase as TaskEoid" + - ", UsedInTypeSVMChangeRequestType as ChangeEoid", - filter); - - if (tbl?.Rows == null || tbl.Rows.Count == 0) - return new List(); - - var entries = new List(tbl.Rows.Count); - foreach (DataRow row in tbl.Rows) - { - var ticketId = getGuidFromObject(row["EOID"]); - if (ticketId == Guid.Empty) - continue; - - var ticketEoid = getGuidFromObject(row["TicketEoid"]); - var incidentEoid = getGuidFromObject(row["IncidentEoid"]); - var alertEoid = getGuidFromObject(row["AlertEoid"]); - var problemEoid = getGuidFromObject(row["ProblemEoid"]); - var serviceRequestEoid = getGuidFromObject(row["ServiceRequestEoid"]); - var taskEoid = getGuidFromObject(row["TaskEoid"]); - var changeEoid = getGuidFromObject(row["ChangeEoid"]); - var isIncident = incidentEoid != Guid.Empty; - var activityType = ResolveTicketOverviewActivityType( - ticketEoid, - incidentEoid, - alertEoid, - problemEoid, - serviceRequestEoid, - taskEoid, - changeEoid); - - entries.Add(new TicketOverviewEntry - { - TicketId = ticketId, - TicketNumber = getStringFromObject(row["TicketNumber"]), - Summary = getStringFromObject(row["Subject"]), - InitiatorId = getGuidFromObject(row["InitiatorId"]), - InitiatorDisplayName = getStringFromObject(row["Initiator"]), - InitiatorAccount = getStringFromObject(row["InitiatorAccount"]), - InitiatorDomain = getStringFromObject(row["InitiatorDomain"]), - InitiatorSid = getStringFromObject(row["InitiatorSid"]), - RecipientId = getGuidFromObject(row["RecipientId"]), - RecipientRoleId = getGuidFromObject(row["RecipientRoleId"]), - State = getIntFromObject(row["State"]), - CreatedDate = getDateTimeFromObject(row["CreatedDate"]), - NewInformationReceived = GetBoolValue(row["NewInformationReceived"]), - ReactionTimeEscalated = GetBoolValue(row["ReactionTimeEscalated"]), - SolutionTimeEscalated = GetBoolValue(row["SolutionTimeEscalated"]), - IsIncident = isIncident, - ActivityType = activityType - }); - } - - return entries; - } - catch (Exception E) - { - LogException(E); - return new List(); - } - finally - { - LogMethodEnd(CM); - } - } - - private static string ResolveTicketOverviewActivityType( - Guid ticketEoid, - Guid incidentEoid, - Guid alertEoid, - Guid problemEoid, - Guid serviceRequestEoid, - Guid taskEoid, - Guid changeEoid) - { - if (incidentEoid != Guid.Empty) - return "SPSActivityTypeIncident"; - if (ticketEoid != Guid.Empty) - return "SPSActivityTypeTicket"; - if (alertEoid != Guid.Empty) - return "SPSActivityTypeAlert"; - if (problemEoid != Guid.Empty) - return "SPSActivityTypeGroupTicket"; - if (serviceRequestEoid != Guid.Empty) - return "SPSActivityTypeServiceRequest"; - if (taskEoid != Guid.Empty) - return "SPSActivityTypeBase"; - if (changeEoid != Guid.Empty) - return "SVMChangeRequestType"; - - return null; - } - - private async Task BuildTicketOverviewFilterAsync( - string sid, - bool useRoleScope, - int queueoption, - List queues) - { - var filter = BuildTicketOverviewBaseFilter(queueoption, queues); - - if (!useRoleScope) - { - var recipientFilter = $"Recipient.Accounts.T(SPSAccountClassAd).Sid = '{Escape(sid)}'"; - filter += $" AND ({recipientFilter})"; - return filter; - } - - var roleIds = await ResolveTicketOverviewRoleIdsAsync(sid, null); - return BuildTicketOverviewFilterForRoleIds(roleIds, filter); - } - - private string BuildTicketOverviewBaseFilter(int queueoption, List queues) - { - var filter = "T(SPSCommonClassBase).State <> 204"; - - if (ticketAndServiceRequestEnabled()) - { - filter += " AND (UsedInTypeSPSActivityTypeIncident IS NOT NULL" + - " OR UsedInTypeSPSActivityTypeTicket IS NOT NULL" + - " OR UsedInTypeSPSActivityTypeServiceRequest IS NOT NULL)"; - } - else - { - filter += " AND (UsedInTypeSPSActivityTypeIncident IS NOT NULL)"; - } - - filter = AppendQueueFilter(filter, queueoption, queues); - return filter; - } - - private string BuildTicketOverviewFilterForRoleIds( - IEnumerable roleIds, - string baseFilter = null, - int queueoption = 0, - List queues = null) - { - var filter = string.IsNullOrWhiteSpace(baseFilter) - ? BuildTicketOverviewBaseFilter(queueoption, queues) - : baseFilter; - - var roleClause = BuildRoleIdInClause(roleIds); - if (string.IsNullOrWhiteSpace(roleClause)) - return null; - - filter += $" AND {roleClause}"; - return filter; - } - - private static string BuildRoleIdInClause(IEnumerable roleIds) - { - var roleIdList = (roleIds ?? Enumerable.Empty()) - .Where(id => id != Guid.Empty) - .Distinct() - .Select(id => $"'{id}'") - .ToList(); - - if (roleIdList.Count == 0) - return null; - - return $"RecipientRole.T(SPSSecurityClassRole).ID IN ({string.Join(", ", roleIdList)})"; - } - - private string AppendQueueFilter(string filter, int queueoption, List queues) - { - if (queues != null && queues.Count > 0) - { - var escapedNames = queues - .Select(q => $"'{Escape(q.QueueName)}'") - .ToList(); - var escapedIds = queues - .Select(q => $"'{Escape(q.QueueID.ToString())}'") - .ToList(); - - string nameList = string.Join(", ", escapedNames); - string idList = string.Join(", ", escapedIds); - - switch (queueoption) - { - case 1: - filter += - $" AND (" + - "Queue IS NULL" + - $" OR Queue.Name IN ({nameList})" + - $" OR Queue.ID IN ({idList})" + - ")"; - break; - case 2: - filter += - $" AND (" + - "Queue IS NOT NULL" + - $" AND (Queue.Name IN ({nameList})" + - $" OR Queue.ID IN ({idList}))" + - ")"; - break; - case 3: - filter += " AND Queue IS NULL"; - break; - default: - break; - } - } - else if (queueoption == 3) - { - filter += " AND Queue IS NULL"; - } - - return filter; - } - - private async Task> ResolveTicketOverviewRoleIdsAsync(string sid, IEnumerable roleGuids) - { - var roleIds = (roleGuids ?? Enumerable.Empty()) - .Where(id => id != Guid.Empty) - .Distinct() - .ToList(); - - if (roleIds.Count > 0) - return roleIds; - - if (string.IsNullOrWhiteSpace(sid)) - return new List(); - - var userId = getUserBySid(sid); - if (userId == Guid.Empty) - return new List(); - - var roles = await getRoleMembershipById(userId) ?? new List(); - return roles - .Where(role => role != null && role.Id != Guid.Empty) - .Select(role => role.Id) - .Distinct() - .ToList(); - } - - private static bool IsUnassignedOverviewKey(string key) - { - if (string.IsNullOrWhiteSpace(key)) - return false; - - switch (key.Trim()) - { - case "UnassignedTickets": - case "UnassignedTicketsCritical": - return true; - default: - return false; - } - } - - private static bool MatchesTicketOverviewKey(TicketOverviewEntry entry, string key) - { - if (entry == null || string.IsNullOrWhiteSpace(key)) - return false; - - var isTicket = !entry.IsIncident; - var hasPerson = entry.RecipientId != Guid.Empty; - var hasRole = entry.RecipientRoleId != Guid.Empty; - var isCritical = entry.ReactionTimeEscalated || entry.SolutionTimeEscalated; - var isNew = entry.State == 200; - var isActive = entry.State == 201 || entry.State == 202 || entry.State == 203; - - switch (key.Trim()) - { - case "TicketsNew": - return isTicket && (entry.State == 200 || entry.State == 201); - case "TicketsActive": - return isTicket && isActive; - case "TicketsCritical": - return isTicket && isCritical; - case "TicketsNewInfo": - return isTicket && entry.NewInformationReceived; - case "IncidentNew": - return entry.IsIncident && (entry.State == 200 || entry.State == 201); - case "IncidentActive": - return entry.IsIncident && isActive; - case "IncidentCritical": - return entry.IsIncident && isCritical; - case "IncidentNewInfo": - return entry.IsIncident && entry.NewInformationReceived; - case "UnassignedTickets": - return !hasPerson && hasRole && isNew; - case "UnassignedTicketsCritical": - return !hasPerson && hasRole && isCritical; - default: - return false; - } - } - - private static bool GetBoolValue(object value) - { - if (value == null || value is DBNull) - return false; - if (value is bool boolValue) - return boolValue; - if (value is int intValue) - return intValue != 0; - if (value is long longValue) - return longValue != 0; - - if (bool.TryParse(value.ToString(), out var parsedBool)) - return parsedBool; - if (int.TryParse(value.ToString(), out var parsedInt)) - return parsedInt != 0; - - return false; - } - - private static string ConvertM42State(int state) - { - switch (state) - { - case 200: - return "New"; - case 201: - case 202: - return "InProgress"; - case 203: - return "OnHold"; - case 204: - return "Closed"; - default: - return "Unknown"; - } - } - private (int, string) GetActivityState(Guid activityEOId) - { - var tbl3 = FragmentRequestBase.SimpleLoad(SPSCommonClassBaseID, - "State.Value as State, State.DisplayString as StateDisp", $"[Expression-ObjectID] = '{activityEOId}'"); - if (tbl3?.Rows == null || tbl3.Rows.Count <= 0) - { - LogEntry($"SPSCommonClassBase fragment not found: ClassId={SPSCommonClassBaseID}, ObjectId={activityEOId}", LogLevels.Debug); - return (0, ""); - } - var state = getIntFromObject(tbl3.Rows[0]["State"]); - var stateDisp = getStringFromObject(tbl3.Rows[0]["StateDisp"]); - return (state, stateDisp); - } - private string Escape(string input) - { - return input?.Replace("'", "''"); - } - private string GetActivityFilter( - string userSid, - int hours, - bool ticketAndServiceRequestEnabled, - int queueoption, - List queues - ) - { - // Baseline-Filter auf User und Datum - var filter = $"Initiator.Accounts.T(SPSAccountClassAd).Sid = '{Escape(userSid)}'"; - - string fStartDate = AsqlHelper.PrepareDateTime(DateTime.UtcNow.AddHours(-hours), true); - string fEndDate = AsqlHelper.PrepareDateTime(DateTime.UtcNow, true); - - // Incident vs. Ticket/ServiceRequest - if (ticketAndServiceRequestEnabled) - { - filter += - " AND (UsedInTypeSPSActivityTypeIncident IS NOT NULL" + - " OR UsedInTypeSPSActivityTypeTicket IS NOT NULL" + - " OR UsedInTypeSPSActivityTypeServiceRequest IS NOT NULL)"; - } - else - { - filter += " AND (UsedInTypeSPSActivityTypeIncident IS NOT NULL)"; - } - - // Offene bzw. kürzlich geschlossene Objekte - filter += - " AND (T(SPSCommonClassBase).State <> 204" + - $" OR (ClosedDate > {fStartDate} AND ClosedDate < {fEndDate}))"; - - // Queue-Filter nur, wenn tatsächlich Queues übergeben wurden - if (queues != null && queues.Count > 0) - { - // URL-escaping für Name und ID - var escapedNames = queues - .Select(q => $"'{Escape(q.QueueName)}'") - .ToList(); - var escapedIds = queues - .Select(q => $"'{Escape(q.QueueID.ToString())}'") - .ToList(); - - string nameList = string.Join(", ", escapedNames); - string idList = string.Join(", ", escapedIds); - - switch (queueoption) - { - // 1 = entweder keine Queue oder eine der übergebenen Queues (Name oder ID) - case 1: - filter += - $" AND (" + - "Queue IS NULL" + - $" OR Queue.Name IN ({nameList})" + - $" OR Queue.ID IN ({idList})" + - ")"; - break; - - // 2 = nur die übergebenen Queues (Name oder ID) - case 2: - filter += - $" AND (" + - "Queue IS NOT NULL" + - $" AND (Queue.Name IN ({nameList})" + - $" OR Queue.ID IN ({idList}))" + - ")"; - break; - - // 3 = nur Objekte ohne Queue - case 3: - filter += " AND Queue IS NULL"; - break; - - // 0 oder andere = keine zusätzliche Einschränkung - default: - break; - } - } - else if (queueoption == 3) - { - // Ausnahme: wenn keine Queues übergeben, aber Option 3 = nur ohne Queue - filter += " AND Queue IS NULL"; - } - - return filter; - } - - - internal async Task getDirectLinkCreateTicket(string sid, string assetname) - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - try - { - await Task.Delay(0); - - // get global settings - bool TicketAndServiceRequestEnabled = ticketAndServiceRequestEnabled(); - - var user = getUserBySid(sid); - var asset = getAssetByName(assetname); - dynamic presetParamsDyn = new ExpandoObject(); - - presetParamsDyn.SPSActivityClassBase = new ExpandoObject(); - presetParamsDyn.SPSActivityClassBase.Subject = placeHolderSubject; - presetParamsDyn.SPSActivityClassBase.DescriptionHTML = placeHolderDescription; - if (user != Guid.Empty) - presetParamsDyn.SPSActivityClassBase.Initiator = user; - if (asset != null) - { - presetParamsDyn.SPSActivityClassIncident = new ExpandoObject(); - presetParamsDyn.SPSActivityClassIncident.Asset = asset.Id; - } - var type = TicketAndServiceRequestEnabled ? "SPSActivityTypeTicket" : "SPSActivityTypeIncident"; - var presetParams = HttpUtility.UrlEncode(JsonConvert.SerializeObject(presetParamsDyn)); - var directLink = string.Format(TicketDirectLinkCreateTemplate, F4SDM42WebApiController.defaultInstance.BaseUrl, type, presetParams); - return new DirectLink() - { - Link = directLink, - DescriptionParameter = placeHolderDescription, - SubjectParameter = placeHolderSubject - }; - } - catch (Exception E) - { - LogException(E); - return null; - } - finally - { - LogMethodEnd(CM); - } - } - - private static bool ticketAndServiceRequestEnabled() - { - var configProvider = F4SDM42WebApiController.defaultInstance._globalConfigurationProvider; - - // using reflection because signature of "ReloadSettings" changed in ESM v12 - var method = configProvider.GetType().GetMethod("ReloadSettings"); - - if (method != null) - { - var defaultParameters = method.GetParameters().Select(p => p.HasDefaultValue ? p.DefaultValue : null).ToArray(); - method.Invoke(configProvider, defaultParameters); - } - - return configProvider.ServiceDeskConfiguration.TicketAndServiceRequestEnabled; - } - - internal async Task> getTicketDetails(List ticketObjectIds) - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - try - { - await Task.Delay(0); - - var Filter = AsqlHelper.BuildInCondition("[Expression-ObjectId]", ticketObjectIds); - LogEntry($"ASql Filter: {Filter}"); - - var tbl = FragmentRequestBase.SimpleLoad(SPSActivityClassBaseID, - "[Expression-ObjectId] as EOID" + - ", TicketNumber" + - ", Subject" + - ", Category.Name as Category" + - ", Category as CategoryId" + - ", CreatedDate, ClosedDate" + - ", Initiator as InitiatorId" + - ", Initiator.LastName + ISNULL(', ' + Initiator.FirstName, '') as Initiator" + - ", DescriptionHTML" + - ", Impact" + - ", Impact.DisplayString as ImpactDisp" + - ", Urgency" + - ", Urgency.DisplayString as UrgencyDisp" + - ", Priority" + - ", Priority.Description as PrioDisp" + - ", SolutionHTML", Filter); - - if (tbl == null || tbl.Rows == null) - { - LogEntry($"No activity entry list found with [Expression-ObjectId]='{string.Join(", ", ticketObjectIds)}'", LogLevels.Warning); - return null; - } - - var tickets = new List(); - - foreach (DataRow Entry in tbl.Rows) - { - var ActivityEOID = getGuidFromObject(Entry["EOID"]); - if (ActivityEOID == Guid.Empty) - { - LogEntry($"No expression object id found for activity entry", LogLevels.Warning); - continue; - } - - var InitiatorId = getGuidFromObject(Entry["InitiatorId"]); - var Initiator = getStringFromObject(Entry["Initiator"]); - if (InitiatorId == Guid.Empty) - { - LogEntry($"No Initiator id found for activity entry", LogLevels.Warning); - } - - var TicketNumber = getStringFromObject(Entry["TicketNumber"]); - if (string.IsNullOrEmpty(TicketNumber)) - { - LogEntry($"No TicketNumber found for activity entry", LogLevels.Warning); - continue; - } - - var CategoryId = getGuidFromObject(Entry["CategoryId"]); - if (CategoryId == Guid.Empty) - { - LogEntry($"No Initiator object id found for activity entry", LogLevels.Warning); - continue; - } - - var Category = getStringFromObject(Entry["Category"]); - if (string.IsNullOrEmpty(Category)) - { - LogEntry($"No Category found for activity entry", LogLevels.Warning); - continue; - } - - var CreatedDate = getDateTimeFromObject(Entry["CreatedDate"]); - if (CreatedDate == DateTime.MinValue) - { - LogEntry($"No CreationDate found for activity entry", LogLevels.Warning); - continue; - } - - var ClosedDate = getDateTimeFromObject(Entry["ClosedDate"]); - var DescriptionHtml = getStringFromObject(Entry["DescriptionHTML"]); - var Description = DescriptionHtml != string.Empty ? Matrix42.Common.Html.HtmlConverter.ConvertHtmlToPlainText(DescriptionHtml) : string.Empty; - - var SolutionHtml = getStringFromObject(Entry["SolutionHTML"]); - var Solution = SolutionHtml != string.Empty ? Matrix42.Common.Html.HtmlConverter.ConvertHtmlToPlainText(SolutionHtml) : string.Empty; - - var Subject = getStringFromObject(Entry["Subject"]); - if (string.IsNullOrEmpty(Subject)) - { - LogEntry($"No Subject found for activity entry", LogLevels.Warning); - continue; - } - - var PriorityId = getIntFromObject(Entry["Priority"]); - var Priority = getStringFromObject(Entry["PrioDisp"]); - - var UrgencyId = getIntFromObject(Entry["Urgency"]); - var Urgency = getStringFromObject(Entry["UrgencyDisp"]); - - var ImpactId = getIntFromObject(Entry["Impact"]); - var Impact = getStringFromObject(Entry["ImpactDisp"]); - - LogEntry($"get category information: {Filter}"); - Filter = string.Format("Recursive(Children).T(SPSScCategoryClassBase).Id='{0}'", CategoryId); - var tbl1 = FragmentRequestBase.SimpleLoad(SPSScCategoryClassBaseID, "Name", Filter); - if (tbl1?.Rows == null || tbl1.Rows.Count <= 0) - { - LogEntry($"No Category entry list found with Initiator='{CategoryId}'", LogLevels.Warning); - return null; - } - - var CategoryHierarchical = string.Join(" > ", tbl1.Rows.Cast().Reverse().Select(row => getStringFromObject(row["Name"]))); - - var tbl2 = FragmentRequestBase.SimpleLoad(SPSActivityClassIncidentID, "EntryBy as EntryBy, EntryBy.DisplayString as EntryByDisp, COALESCE(AssetAffected, Asset) as Asset, COALESCE(AssetAffected.T(SPSComputerClassAD).Domain.NT4Name, Asset.T(SPSComputerClassAD).Domain.NT4Name) as AssetDomain, COALESCE(COALESCE(AssetAffected.T(SPSComputerClassBase).Name, AssetAffected.T(SPSAssetClassSIMCard).PhoneNumber, AssetAffected.Name, AssetAffected.objectid), COALESCE(Asset.T(SPSComputerClassBase).Name, Asset.T(SPSAssetClassSIMCard).PhoneNumber, Asset.Name, Asset.objectid)) as AssetName", $"[Expression-ObjectID] = '{ActivityEOID}'"); - - if (tbl2?.Rows == null || tbl2.Rows.Count <= 0) - { - LogEntry($"SPSActivityClassIncident fragment not found: ClassId={SPSActivityClassIncidentID}, ObjectId={ActivityEOID}", LogLevels.Debug); - continue; - } - - var AssetId = getGuidFromObject(tbl2.Rows[0]["Asset"]); - var Asset = getStringFromObject(tbl2.Rows[0]["AssetName"]); - var AssetDomain = getStringFromObject(tbl2.Rows[0]["AssetDomain"]); - var EntryBy = getIntFromObject(tbl2.Rows[0]["EntryBy"]); - var EntryByDisp = getStringFromObject(tbl2.Rows[0]["EntryByDisp"]); - - M42Asset AssetObject = null; - if (AssetId != Guid.Empty) - AssetObject = getAssetsByAsql($"ID = '{AssetId}'").FirstOrDefault(); - - var tbl3 = FragmentRequestBase.SimpleLoad(SPSCommonClassBaseID, "State, State.DisplayString as StateDisp, SUBQUERY(BasicSchemaObjectType AS t, t.Name, t.ID=base.TypeID) as CIName", $"[Expression-ObjectID] = '{ActivityEOID}'"); - if (tbl3?.Rows == null || tbl3.Rows.Count <= 0) - { - LogEntry($"SPSCommonClassBase fragment not found: ClassId={SPSCommonClassBaseID}, ObjectId={ActivityEOID}", LogLevels.Debug); - continue; - } - - var State = getIntFromObject(tbl3.Rows[0]["State"]); - var StateDisp = getStringFromObject(tbl3.Rows[0]["StateDisp"]); - var CIName = getStringFromObject(tbl3.Rows[0]["CIName"]); - - dynamic viewOptionsDyn = new ExpandoObject(); - viewOptionsDyn.objectId = ActivityEOID; - viewOptionsDyn.type = CIName; - viewOptionsDyn.viewType = "action"; - viewOptionsDyn.actionId = TicketCloseActionId; - var viewOptions = HttpUtility.UrlEncode(JsonConvert.SerializeObject(viewOptionsDyn)); - - var ticketDirectLinkPreview = string.Format(TicketDirectLinkPreviewTemplate, F4SDM42WebApiController.defaultInstance.BaseUrl, CIName, ActivityEOID); - var ticketDirectLinkEdit = string.Format(TicketDirectLinkEditTemplate, F4SDM42WebApiController.defaultInstance.BaseUrl, CIName, ActivityEOID); - var ticketDirectLinkClose = string.Format(IncidentDirectLinkCloseTemplate, F4SDM42WebApiController.defaultInstance.BaseUrl, ActivityEOID, viewOptions); - - LogEntry($"Activity found: ObjectID={ActivityEOID}, TicketNumber={TicketNumber}, Subject={Subject}, State={State}", LogLevels.Debug); - var ticket = new cF4SDTicket() - { - TicketObjectId = ActivityEOID, - Name = TicketNumber, - CIName = CIName, - StatusId = State, - Status = StateDisp, - Summary = Subject, - AffectedUserId = InitiatorId, - AffectedUser = Initiator, - CreationDate = CreatedDate, - ClosingDate = ClosedDate, - DescriptionHtml = DescriptionHtml, - Description = Description, - SolutionHtml = SolutionHtml, - Solution = Solution, - Priority = Priority, - PriorityId = PriorityId, - CreationSourceId = EntryBy, - CreationSource = EntryByDisp, - CategoryHierarchical = CategoryHierarchical, - CategoryId = CategoryId, - Category = Category, - DirectLinkPreview = ticketDirectLinkPreview, - Urgency = Urgency, - UrgencyId = UrgencyId, - Impact = Impact, - ImpactId = ImpactId - //JournalItems = GetJournalEntriesByEOID(ActivityEOID) - }; - - if (AssetObject != null) - { - ticket.AssetId = AssetId; - ticket.AssetName = Asset; - ticket.AssetDomain = AssetDomain; - ticket.AssetCIId = AssetObject.CIId; - ticket.AssetCIName = AssetObject.CIName; - ticket.AssetSKUAssetGroupId = AssetObject.SKUAssetGroupId; - ticket.AssetSKUAssetGroup = AssetObject.SKUAssetGroup; - ticket.AssetSKUTypeId = AssetObject.SKUTypeId; - ticket.AssetSKUType = AssetObject.SKUType; - } - - if (ticket.StatusId != 204) - ticket.DirectLinkEdit = ticketDirectLinkEdit; - - if ((CIName.ToUpper() == "SPSACTIVITYTYPEINCIDENT" || CIName.ToUpper() == "SPSACTIVITYTYPESERVICEREQUEST") && ticket.StatusId != 204) - ticket.DirectLinkClose = ticketDirectLinkClose; - - tickets.Add(ticket); - } - - tickets = tickets.OrderBy(x => x.CreationDate).ToList(); - tickets.Reverse(); - return tickets; - } - catch (Exception E) - { - LogException(E); - return null; - } - finally - { - LogMethodEnd(CM); - } - } - - internal async Task> GetJournalEntries(Guid activityEOID) - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - try - { - await Task.Delay(0); - List journalEntries = new List(); - var entries = F4SDM42WebApiController.defaultInstance._journalService.GetJournalList(activityEOID, false, 0, 50, "{2}", 120); - LogEntry($"{entries.Length} Journal entries found for ObjectID={activityEOID}", LogLevels.Debug); - for (int i = 0; i < entries.Length; i++) - { - Matrix42.Contracts.Platform.Data.JournalEntryInfo item = entries[i]; - LogEntry($"Journal entry {i + 1}/{entries.Length}: ID={item.Id}, CreatedDate={item.CreatedDate}, CreatedBy={item.Creator}, Header={item.Header}", LogLevels.Debug); - journalEntries.Add(new cTicketJournalItem() - { - JournalId = item.Id, - ActivityObjectId = activityEOID, - CreatedBy = item.Creator, - CreationDate = (DateTime)item.CreatedDate, - DescriptionHtml = item.Text, - Description = Matrix42.Common.Html.HtmlConverter.ConvertHtmlToPlainText(item.Text), - Header = item.Header, - IsVisibleForUser = item.VisibleInPortal - }); - } - return journalEntries; - } - catch (Exception E) - { - LogException(E); - return null; - } - finally - { - LogMethodEnd(CM); - } - } - - internal async Task updateActivitySolution(Guid objectId, string solutionHtml) - { - - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - try - { - await Task.Delay(0); - if (objectId == Guid.Empty) - return false; - - var tbl = FragmentRequestBase.SimpleLoad(SPSActivityClassBaseID, "ID", $"[Expression-ObjectID] = '{objectId}'"); - if (tbl?.Rows == null || tbl.Rows.Count <= 0) - { - LogEntry($"SPSActivityClassBase fragment not found: ClassId={SPSActivityClassBaseID}, ObjectId={objectId}", LogLevels.Debug); - return false; - } - - var fragmentId = getGuidFromObject(tbl.Rows[0]["ID"]); - SPSFragment activityFragment = ObjectBroker.GetFragment(SPSActivityClassBaseID, fragmentId); - activityFragment["SolutionHTML"] = solutionHtml; - ObjectBroker.UpdateFragment(SPSActivityClassBaseID, activityFragment); - return true; - } - catch (Exception E) - { - LogException(E); - return false; - } - finally - { - LogMethodEnd(CM); - } - } - - private List getAssetsByAsql(string Filter) - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - try - { - // get SPSAssetClassBase - if (string.IsNullOrEmpty(Filter)) - return null; - List assets = new List(); - LogEntry($"ASql Filter: {Filter}"); - var tbl = FragmentRequestBase.SimpleLoad(SPSAssetClassBaseID - , "Id" + - ", COALESCE(T(SPSComputerClassBase).Name, T(SPSAssetClassSIMCard).PhoneNumber, Name) as AssetName" + - ", SUBQUERY(BasicSchemaObjectType AS t, t.Name, t.ID=base.T(SPSCommonClassBase).TypeID) as CIName" + - ", SUBQUERY(BasicSchemaObjectType AS t, t.Id, t.ID=base.T(SPSCommonClassBase).TypeID) as CIId" + - ", SKU.Type as SKUTypeId" + - ", SKU.Type.DisplayString as SKUType" + - ", SKU.Type.AssetGroup as SKUAssetGroupId" + - ", SUBQUERY(SPSAssetPickupTypeCategory AS ag, ag.DisplayString, ag.Value=base.SKU.Type.AssetGroup) as SKUAssetGroup" + - ", T(SPSComputerClassAD).Domain.NT4Name as DomainName" + - ", T(SPSComputerClassAD).Sid as Sid" - , Filter); - if (tbl?.Rows == null || tbl.Rows.Count <= 0) - { - LogEntry($"SPSAssetClassBase fragment not found: ClassId={SPSActivityClassIncidentID}, Filter={Filter}", LogLevels.Debug); - return null; - } - else - { - foreach (DataRow row in tbl.Rows) - { - var asset = new M42Asset() - { - Id = getGuidFromObject(row["Id"]), - Name = getStringFromObject(row["AssetName"]), - CIName = getStringFromObject(row["CIName"]), - CIId = getGuidFromObject(row["CIId"]), - SKUTypeId = getIntFromObject(row["SKUTypeId"]), - SKUType = getStringFromObject(row["SKUType"]), - SKUAssetGroupId = getIntFromObject(row["SKUAssetGroupId"]), - SKUAssetGroup = getStringFromObject(row["SKUAssetGroup"]), - DomainName = getStringFromObject(row["DomainName"]), - Sid = getStringFromObject(row["Sid"]), - }; - assets.Add(asset); - LogEntry($"Asset found: Id={asset.Id}, Name={asset.Name}, CIName={asset.CIName}", LogLevels.Debug); - } - } - return assets; - } - catch (Exception E) - { - LogException(E); - return null; - } - finally - { - LogMethodEnd(CM); - } - } - - private M42Asset getAssetByName(string assetname) - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - try - { - // get SPSAssetClassBase - if (string.IsNullOrEmpty(assetname)) - return null; - var Filter = string.Format("T(SPSComputerClassBase).Name = '{0}' OR T(SPSAssetClassSIMCard).PhoneNumber = '{0}' OR Name = '{0}'", assetname); - return getAssetsByAsql(Filter)?.First(); - } - catch (Exception E) - { - LogException(E); - return null; - } - finally - { - LogMethodEnd(CM); - } - } - private Guid getUserBySid(string sid) - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - try - { - string sidPattern = @"^S-\d-\d+-(\d+-){1,14}\d+$"; - if (string.IsNullOrEmpty(sid) || !Regex.IsMatch(sid, sidPattern)) - { - LogEntry($"Invalid or empty SID: '{sid}'", LogLevels.Warning); - return Guid.Empty; - } - - var users = getUsersByAsql(string.Format("Accounts.T(SPSAccountClassAD).Sid = '{0}' OR PrimaryAccount.T(SPSAccountClassAD).Sid = '{0}'", sid)); - return users != null ? users.First().Id : Guid.Empty; - } - catch (Exception E) - { - LogException(E); - return Guid.Empty; - } - finally - { - LogMethodEnd(CM); - } - } - - - private List getUsersByAsql(string asqlFilter) - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - try - { - var Persons = new List(); - - - LogEntry($"ASql Filter: {asqlFilter}"); - - var tbl = FragmentRequestBase.SimpleLoad(SPSUserClassBaseID, - "Id as Id" + - ", [Expression-ObjectID] as UserEOID" + - ", T(SPSCommonClassBase).State as State" + - ", LastName + ISNULL(', ' + FirstName,'') as Name" + - ", PreferredMailCulture.Locale as Locale" + - ", T(SPSCommonClassBase).State.DisplayString as StateDisp", - asqlFilter); - if (tbl?.Rows == null || tbl.Rows.Count <= 0) - { - LogEntry($"no user entry list found with asql='{asqlFilter}'", LogLevels.Warning); - return null; - } - foreach (DataRow Entry in tbl.Rows) - { - // get the id - var UserId = getGuidFromObject(Entry["ID"]); - if (UserId == Guid.Empty) - { - LogEntry($"no id found for user entry", LogLevels.Warning); - continue; - } - var UserEOID = getGuidFromObject(Entry["UserEOID"]); - if (UserEOID == Guid.Empty) - { - LogEntry($"no expression object id found for user entry", LogLevels.Warning); - continue; - } - var Name = getStringFromObject(Entry["Name"]); - if (string.IsNullOrEmpty(Name)) - { - LogEntry($"no Name found for entry", LogLevels.Debug); - } - var Locale = getStringFromObject(Entry["Locale"]); - if (string.IsNullOrEmpty(Locale)) - { - LogEntry($"no locale found for entry", LogLevels.Debug); - } - var StateDisp = getStringFromObject(Entry["StateDisp"]); - if (string.IsNullOrEmpty(StateDisp)) - { - LogEntry($"no statedisp found for entry", LogLevels.Debug); - } - - - - var State = getIntFromObject(Entry["State"]); - LogEntry($"User found: ID={UserId}, ObjectID={UserEOID}, State={State}", LogLevels.Debug); - if (State != 2023) - LogEntry($"User is not active", LogLevels.Debug); - Persons.Add(new M42User() - { - Id = UserId, - ObjectId = UserEOID, - Name = Name, - State = State, - Locale = Locale, - LanguageId = new CultureInfo(Locale).LCID % 1024, - StateDisp = StateDisp - }); - } - return Persons; - } - catch (Exception E) - { - LogException(E); - return null; - } - finally - { - LogMethodEnd(CM); - } - } - private List getAccountsByAsql(string asqlFilter) - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - try - { - var result = new List(); - - - LogEntry($"ASql Filter: {asqlFilter}"); - - var tbl = FragmentRequestBase.SimpleLoad(SPSAccountClassBaseID, - "Id as Id" + - ", [Expression-ObjectID] as EOID" + - ", T(SPSCommonClassBase).State as State" + - ", T(SPSAccountClassAD).Sid as Sid" + - ", T(SPSAccountClassAD).UserPrincipalName as UserPrincipalName" + - ", Owner ", - asqlFilter); - if (tbl?.Rows == null || tbl.Rows.Count <= 0) - { - LogEntry($"no account entry list found with asql='{asqlFilter}'", LogLevels.Warning); - return null; - } - foreach (DataRow Entry in tbl.Rows) - { - // get the id - var Id = getGuidFromObject(Entry["ID"]); - if (Id == Guid.Empty) - { - LogEntry($"no id found for entry", LogLevels.Warning); - continue; - } - var EOID = getGuidFromObject(Entry["EOID"]); - if (EOID == Guid.Empty) - { - LogEntry($"no expression object id found for entry", LogLevels.Warning); - continue; - } - var Owner = getGuidFromObject(Entry["Owner"]); - if (Owner == Guid.Empty) - { - LogEntry($"no owner found for entry", LogLevels.Warning); - } - var Sid = getStringFromObject(Entry["Sid"]); - if (string.IsNullOrEmpty(Sid)) - { - LogEntry($"no Sid found for entry", LogLevels.Debug); - } - var UserPrincipalName = getStringFromObject(Entry["UserPrincipalName"]); - if (string.IsNullOrEmpty(UserPrincipalName)) - { - LogEntry($"no UserPrincipalName found for entry", LogLevels.Debug); - } - - - var State = getIntFromObject(Entry["State"]); - LogEntry($"Account found: ID={Id}, ObjectID={EOID}, State={State}", LogLevels.Debug); - result.Add(new M42Account() - { - Id = Id, - EOID = EOID, - State = State, - UserPrincipalName = UserPrincipalName, - Sid = Sid, - Owner = Owner - }); - } - return result; - } - catch (Exception E) - { - LogException(E); - return null; - } - finally - { - LogMethodEnd(CM); - } - } - internal HttpResponseMessage privGetLog(string download, int maxLines, HttpRequestMessage request, string filter) - { - var response = new HttpResponseMessage(); - - - - if (download == "1") - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - try - { - var logger = (DefaultLogger.Manager as cLogManagerFile); - var logFileName = logger.GetLogFileName(); - MemoryStream memoryStream = new MemoryStream(); - - ZipArchive zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Create, leaveOpen: true); - string[] files = Directory.GetFiles(Path.GetDirectoryName(logFileName), $"*.log"); - foreach (string fileName in files) - { - using (var tmpInStream = new FileStream(logFileName, FileMode.Open, - FileAccess.Read, FileShare.ReadWrite)) - { - ZipArchiveEntry zipArchiveEntry = zipArchive.CreateEntry(Path.GetFileName(fileName)); - using (Stream destination = zipArchiveEntry.Open()) - { - tmpInStream.CopyTo(destination); - } - } - } - zipArchive.Dispose(); - memoryStream.Position = 0L; - HttpResponseMessage httpResponseMessage = request.CreateResponse(HttpStatusCode.OK); - httpResponseMessage.Content = new StreamContent(memoryStream); - httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") - { - FileName = Path.GetFileNameWithoutExtension(logFileName) + ".zip" - }; - httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); - - return httpResponseMessage; - } - catch (Exception E) - { - LogException(E); - return null; - } - finally - { - LogMethodEnd(CM); - } - - } - else - { - var logger = (DefaultLogger.Manager as cLogManagerFile); - var logFileName = logger.GetLogFileName(); - using (var inStream = new FileStream(logFileName, FileMode.Open, - FileAccess.Read, FileShare.ReadWrite)) - { - var lines = ReadLines(() => inStream, - Encoding.UTF8) - .ToList(); - var sb = new StringBuilder(); - sb.AppendLine(""); - var htmlLines = new List(); - foreach (var line in lines) - { - var lineSplit = line.Split('\t'); - if (string.IsNullOrEmpty(filter) || !string.IsNullOrEmpty(filter) && lineSplit.Length > 4 && filter.ToLowerInvariant().Split(',').Contains(lineSplit[3].ToLowerInvariant())) - htmlLines.Add(""); - } - if (maxLines > 0) - htmlLines = htmlLines.Skip(Math.Max(0, htmlLines.Count() - maxLines)).ToList(); - foreach (var line in htmlLines) - { - sb.AppendLine(line); - } - sb.AppendLine("
" + string.Join("", lineSplit) + "
"); - - response.Content = new StringContent(sb.ToString()); - response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html") - { - CharSet = Encoding.UTF8.HeaderName - }; - response.Content.Headers.Add("CodePage", Encoding.UTF8.CodePage.ToString()); - return response; - } - } - } - - internal List privGetLog2() - { - var response = new HttpResponseMessage(); - { - var logger = (DefaultLogger.Manager as cLogManagerFile); - var logFileName = logger.GetLogFileName(); - using (var inStream = new FileStream(logFileName, FileMode.Open, - FileAccess.Read, FileShare.ReadWrite)) - { - var lines = ReadLines(() => inStream, - Encoding.UTF8) - .ToList(); - - var entries = new List(); - DateTime dateValue; - for (int i = 0; i < lines.Count; i++) - { - string line = lines[i]; - try - { - var lineSplit = line.Split('\t'); - if (lineSplit.Length >= 5) - { - if (string.IsNullOrEmpty(lineSplit[0])) - { - entries.Last().Message += Environment.NewLine + lineSplit[4]; - continue; - } - DateTime.TryParseExact(lineSplit[0], "yyyy-MM-dd HH:mm:ss:fffff", CultureInfo.InvariantCulture, DateTimeStyles.None, out dateValue); - entries.Add(new cM42LogEntry() - { - LineNumber = i + 1, - date = dateValue, - ProcessId = lineSplit[1], - logLvl = lineSplit[3], - Theme = lineSplit[2], - Message = lineSplit[4], - }); - } - } - catch (Exception) - { - - } - } - return entries; - } - } - } - - private int getIntFromObject(object o, int Default = 0) - { - try - { - if (o == null) - return Default; - if (o is DBNull) - return Default; - if (o is int @int) - return @int; - if (o is long int1) - return (int)int1; - if (int.TryParse(o.ToString(), out var r)) - return r; - } - catch { } - return Default; - } - - private DateTime getDateTimeFromObject(object o) - { - try - { - if (o == null) - return DateTime.MinValue; - if (o is DBNull) - return DateTime.MinValue; - if (o is DateTime @dateTime) - return @dateTime; - if (o is string dstr && DateTime.TryParse(o.ToString(), out var r)) - return r; - } - catch { } - return DateTime.MinValue; - } - - private string getStringFromObject(object o, string Default = "") - { - try - { - if (o == null) - return Default; - if (o is DBNull) - return Default; - return o.ToString(); - } - catch { } - return Default; - } - - private Guid getGuidFromObject(object o) - { - try - { - if (o == null) - return Guid.Empty; - if (o is DBNull) - return Guid.Empty; - if (o is Guid G) - return G; - if (Guid.TryParse(o.ToString(), out var r)) - return r; - } - catch { } - return Guid.Empty; - } - - internal cM42LogEntry privGetLog2(int id) - { - return privGetLog2().Find(x => x.LineNumber == id); - } - - internal async Task> getRoleMembershipById(Guid UserId) - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - var RoleMemberships = new List(); - try - { - await Task.Delay(0); - var asqlFilter = string.Format("Members.Id = '{0}'", UserId.ToString()); - LogEntry($"ASql Filter: {asqlFilter}"); - - FragmentRequestBase fragmentRequestBase = new FragmentRequestBase(SPSSecurityClassRole, ColumnSelectOption.List, "Id as Id" + - ", Name as Name"); - fragmentRequestBase.Where = asqlFilter; - var langExt = new FragmentRequestExtensionLanguage(); - langExt.AddCultureRequest(new CultureInfo("en")); - fragmentRequestBase.AddExtension(langExt); - - using (SPSTransactionScope sPSTransactionScope = new SPSTransactionScope(SPSTransactionScopeOption.Required, new SPSTransactionOptions(IsolationLevel.ReadUncommitted))) - { - fragmentRequestBase.Load(); - sPSTransactionScope.Complete(); - } - - // if requested language is already "en" use the english table - var tbl = fragmentRequestBase.DataSet.Tables[1]; - if (tbl?.Rows == null || tbl.Rows.Count <= 0) - tbl = fragmentRequestBase.DataSet.Tables[0]; - if (tbl?.Rows == null || tbl.Rows.Count <= 0) - { - LogEntry($"no role membership found with asql='{asqlFilter}'", LogLevels.Debug); - return RoleMemberships; - } - foreach (DataRow Entry in tbl.Rows) - { - if (Entry.Table.Columns.Contains("LCID") && (int)Entry["LCID"] != 9) - continue; - // get the id - var IDColumn = Entry.Table.Columns.Contains("Owner") ? "Owner" : "ID"; - var RoleId = getGuidFromObject(Entry[IDColumn]); - if (RoleId == Guid.Empty) - { - LogEntry($"no id found for role entry", LogLevels.Warning); - continue; - } - var Name = getStringFromObject(Entry["Name"]); - if (string.IsNullOrEmpty(Name)) - { - LogEntry($"no Name found for entry", LogLevels.Debug); - } - LogEntry($"Role Membership found: ID={RoleId}, Name={Name}", LogLevels.Debug); - RoleMemberships.Add(new M42Role() { Id = RoleId, Name = Name }); - } - return RoleMemberships; - } - catch (Exception E) - { - LogException(E); - return null; - } - finally - { - LogMethodEnd(CM); - } - } - - /* - internal async Task> getRoleMembershipById(Guid UserId) - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - var RoleMemberships = new List(); - try - { - await Task.Delay(0); - var asqlFilter = string.Format("Members.Id = '{0}'", UserId.ToString()); - LogEntry($"ASql Filter: {asqlFilter}"); - var tbl = FragmentRequestBase.SimpleLoad(SPSSecurityClassRole, - "Id as Id" + - ", Name as Name", - asqlFilter); - if (tbl?.Rows == null || tbl.Rows.Count <= 0) - { - LogEntry($"no role membership found with asql='{asqlFilter}'", LogLevels.Debug); - return RoleMemberships; - } - foreach (DataRow Entry in tbl.Rows) - { - // get the id - var RoleId = getGuidFromObject(Entry["ID"]); - if (RoleId == Guid.Empty) - { - LogEntry($"no id found for role entry", LogLevels.Warning); - continue; - } - var Name = getStringFromObject(Entry["Name"]); - if (string.IsNullOrEmpty(Name)) - { - LogEntry($"no Name found for entry", LogLevels.Debug); - } - LogEntry($"Role Membership found: ID={RoleId}, Name={Name}", LogLevels.Debug); - RoleMemberships.Add(new M42Role() { Id = RoleId, Name = Name }); - } - return RoleMemberships; - } - catch (Exception E) - { - LogException(E); - return null; - } - finally - { - LogMethodEnd(CM); - } - } - */ - internal async Task UserPermissionsInfo(string filter) - { - var CM = MethodBase.GetCurrentMethod(); - LogMethodBegin(CM); - var RoleMemberships = new List(); - try - { - await Task.Delay(0); - - var retVal = new UserPermissionsInfo(); - List m42Users = getUsersByAsql(filter); - if (m42Users != null && m42Users.Count == 1) - { - retVal.User = m42Users[0]; - - - var user = F4SDM42WebApiController.defaultInstance._userProfile.GetInteractiveUserInfo(retVal.User.Id); - if (user != null) - { - retVal.User.Id = user.Id; - retVal.User.Currency = user.Currency; - retVal.User.Email = user.Email; - retVal.User.FirstName = user.FirstName; - retVal.User.LastName = user.LastName; - retVal.User.Phone = user.Phone; - retVal.User.Photo = user.Photo; - } - - retVal.Roles = await getRoleMembershipById(retVal.User.Id); - retVal.User.IsAdmin = retVal.Roles?.Where(i => i.Id == Administrators).FirstOrDefault() != null; - return retVal; - } - return null; - } - catch (Exception E) - { - LogException(E); - return null; - } - finally - { - LogMethodEnd(CM); - } - } - - private enum eM42EntryBy - { - Phone = 0, - Email = 1, - Portal = 2, - CatalogOrder = 3, - EventTrigger = 4, - Feedback = 5, - VisualSupportAgent = 6, - ComplianceAlert = 7, - F4SD = 20010, - } - - public class DirectLink - { - public string Link { get; set; } - public string SubjectParameter { get; set; } - public string DescriptionParameter { get; set; } - } - - public class M42Asset - { - public Guid Id { get; set; } - public string Name { get; set; } - public string CIName { get; set; } - public string SKUType { get; set; } - public string SKUAssetGroup { get; set; } - public Guid CIId { get; set; } - public int SKUTypeId { get; internal set; } - public int SKUAssetGroupId { get; internal set; } - public string DomainName { get; internal set; } - public string Sid { get; internal set; } - } - } - - public class M42User - { - public Guid Id { get; internal set; } - public Guid ObjectId { get; internal set; } - public string Name { get; internal set; } - public string FirstName { get; internal set; } - public string LastName { get; internal set; } - public string Email { get; internal set; } - public string Photo { get; internal set; } - public string Phone { get; internal set; } - public string Currency { get; internal set; } - public string Locale { get; internal set; } - public int LanguageId { get; internal set; } - public bool IsAdmin { get; internal set; } - public int State { get; internal set; } - public string StateDisp { get; internal set; } - } - - internal class M42Account - { - public Guid Id { get; internal set; } - public Guid EOID { get; internal set; } - public Guid Owner { get; internal set; } - public int State { get; internal set; } - public string UserPrincipalName { get; internal set; } - public string Sid { get; internal set; } - } - - public class M42Role - { - public Guid Id { get; internal set; } - public string Name { get; internal set; } - - } - - public class UserPermissionsInfo - { - public M42User User { get; internal set; } - public List Roles { get; internal set; } - public UserPermissionsInfo() - { - User = new M42User(); - Roles = new List(); - } - } -} +using System; +using System.Collections.Generic; +using System.Data; +using System.Dynamic; +using System.Globalization; +using System.IO; +using System.IO.Compression; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +using Matrix42.Common; +using Matrix42.WebApi.Contracts; +using update4u.SPS.DataLayer; +using update4u.SPS.DataLayer.Transaction; + +using Newtonsoft.Json; + +using C4IT.F4SDM; +using C4IT.FASD.Base; +using C4IT.Logging; + +using static C4IT.Logging.cLogManager; + +namespace C4IT.F4SD +{ + public class F4SDHelperService + { + private static Guid SPSUserClassBaseID = SPSDataEngineSchemaReader.ClassGetIDFromName("SPSUserClassBase"); + private static Guid SPSAccountClassBaseID = SPSDataEngineSchemaReader.ClassGetIDFromName("SPSAccountClassBase"); + private static Guid SPSCommonClassBaseID = SPSDataEngineSchemaReader.ClassGetIDFromName("SPSCommonClassBase"); + private static Guid SPSAccountClassADID = SPSDataEngineSchemaReader.ClassGetIDFromName("SPSAccountClassAD"); + private static Guid SPSActivityClassBaseID = SPSDataEngineSchemaReader.ClassGetIDFromName("SPSActivityClassBase"); + private static Guid SPSActivityClassIncidentID = SPSDataEngineSchemaReader.ClassGetIDFromName("SPSActivityClassIncident"); + private static Guid SPSActivityClassUnitOfWorkID = SPSDataEngineSchemaReader.ClassGetIDFromName("SPSActivityClassUnitOfWork"); + private static Guid SPSScCategoryClassBaseID = SPSDataEngineSchemaReader.ClassGetIDFromName("SPSScCategoryClassBase"); + private static Guid SPSAssetClassBaseID = SPSDataEngineSchemaReader.ClassGetIDFromName("SPSAssetClassBase"); + private static Guid SPSSecurityClassRole = SPSDataEngineSchemaReader.ClassGetIDFromName("SPSSecurityClassRole"); + + public static readonly Guid Administrators = new Guid("{A5D7B682-B211-4D94-A96D-8C57EEDAFDEA}"); + + private const string TicketCloseActionId = "51bb3283-7bd1-e511-9a82-60e327035d31"; + private const string TicketDirectLinkCreateTemplate = @"{0}/wm/app-ServiceDesk/notSet/create-object/{1}?view-options=%7B%22embedded%22:false%7D&presetParams={2}"; + private const string IncidentDirectLinkCloseTemplate = @"{0}/wm/app-ServiceDesk/notSet/preview-object/SPSActivityTypeIncident/{1}/0/?view-options={2}"; + private const string TicketDirectLinkPreviewTemplate = @"{0}/wm/app-ServiceDesk/notSet/preview-object/{1}/{2}/0/"; + private const string TicketDirectLinkEditTemplate = @"{0}/wm/app-ServiceDesk/notSet/edit-object/{1}/{2}"; + + private const string placeHolderSubject = "PARAM_SUBJECT"; + private const string placeHolderDescription = "PARAM_DESCRIPTION"; + private static bool? ticketAndServiceRequestEnabledCache; + private const string c4itf4sdmonLinkBase = "f4sdsend://localhost"; + + private const string F4SDTicketTableName = "M42WPM-TICKETS-INFOS"; + private const string F4SDTicketStatusColumnName = "STATUS"; + + + public static IEnumerable ReadLines(Func streamProvider, + Encoding encoding) + { + using (var stream = streamProvider()) + using (var reader = new StreamReader(stream, encoding)) + { + string line; + while ((line = reader.ReadLine()) != null) + { + yield return line; + } + } + } + + internal async Task getDirectLinkF4SD(Guid EOID, string type) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + LogEntry($"Generating F4SD URI for type: '{type}', GUID: '{EOID}'", LogLevels.Debug); + var builder = new UriBuilder(c4itf4sdmonLinkBase); + var queryString = UrlQueryBuilder.Parse(builder.Query); + + switch (type.ToLowerInvariant().Split('.').Last()) + { + case "person": + case "user": + var user = getUsersByAsql($"[Expression-ObjectId]='{EOID}'")?.FirstOrDefault(); + string Sids = string.Empty; + + if (user != null) + { + var accounts = getAccountsByAsql($"Owner='{user.Id}'"); + Sids = string.Join(",", accounts?.Where(x => !string.IsNullOrEmpty(x.Sid)).Select(x => x.Sid) ?? Array.Empty()); + } + + if (!string.IsNullOrEmpty(user?.Name)) + { + queryString.Add("command", "UserSidSearch"); + queryString.Add("name", user.Name); + queryString.Add("sids", Sids); + } + break; + + case "asset": + var asset = getAssetsByAsql($"UsedInTypeSPSComputerType is not null AND [Expression-ObjectId]='{EOID}'")?.FirstOrDefault(); + if (asset != null) + { + queryString.Add("command", "ComputerDomainSearch"); + queryString.Add("name", asset.Name); + queryString.Add("domain", asset.DomainName); + } + break; + + case "incident": + case "servicerequest": + case "ticket": + var ticket = (await getTicketDetails(new List { EOID }))?.FirstOrDefault(); + if (ticket != null) + { + queryString.Add("command", "TicketSearch"); + queryString.Add("tname", ticket.Name); + queryString.Add("tid", ticket.TicketObjectId.ToString()); + + if (ticket.AffectedUserId != Guid.Empty) + { + var initiator = getUsersByAsql($"ID = '{ticket.AffectedUserId}'")?.FirstOrDefault(); + string userName = initiator?.Name; + Sids = string.Join(",", getAccountsByAsql($"Owner='{ticket.AffectedUserId}'")?.Where(x => !string.IsNullOrEmpty(x.Sid)).Select(x => x.Sid) ?? Array.Empty()); + + queryString.Add("uname", userName); + queryString.Add("sids", Sids); + } + } + break; + + default: + break; + } + + builder.Query = queryString.ToString(); + return string.IsNullOrEmpty(builder.Query) ? null : builder.ToString(); + } + catch (Exception E) + { + LogException(E); + return null; + } + finally + { + LogMethodEnd(CM); + } + } + + + [Obsolete] + internal async Task> getTicketListByUser(string userSid, int hours, int queueoption, List queues) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + LogEntry($"Generating ticket list for userSid: '{userSid}', {hours} hours", LogLevels.Debug); + await Task.Delay(0); + + var tickets = new List(); + var activityFilter = GetActivityFilter(userSid, hours, ticketAndServiceRequestEnabled(), queueoption, queues); + LogEntry($"ASql Filter: {activityFilter}"); + + var activityTable = FragmentRequestBase.SimpleLoad(SPSActivityClassBaseID, + string.Format("[Expression-ObjectID] as EOID, TicketNumber, Subject, Service.ID as ServiceId, Service.Name as ServiceName, SUBQUERY(BasicSchemaObjectType as bso, bso.Name, bso.id = base.T(SPSCommonClassBase).TypeID) as ActivityType" + + ", COALESCE(T(SPSActivityClassIncident).Asset.T(SPSComputerClassBase).Name, T(SPSActivityClassIncident).Asset.T(SPSAssetClassSIMCard).PhoneNumber, T(SPSActivityClassIncident).Asset.Name, T(SPSActivityClassIncident).Asset.objectid) as AssetName" + + ", SUBQUERY(BasicSchemaObjectType AS t, t.Name, t.ID=base.T(SPSActivityClassIncident).Asset.T(SPSCommonClassBase).TypeID) as AssetCIName" + + ", CASE WHEN Initiator.PrimaryAccount.T(SPSAccountClassAd).Sid = '{0}' THEN 1 ELSE 0 END AS IsPrimaryAccount", + userSid), + activityFilter); + + if (activityTable?.Rows == null || activityTable.Rows.Count == 0) + { + LogEntry($"No activity entries found for userSid: '{userSid}'", LogLevels.Warning); + return null; + } + + for (int i = 0; i < activityTable.Rows.Count; i++) + { + DataRow entry = activityTable.Rows[i]; + var activityEOId = getGuidFromObject(entry["EOID"]); + var ticketNumber = getStringFromObject(entry["TicketNumber"]); + var activityType = getStringFromObject(entry["ActivityType"]); + var assetName = getStringFromObject(entry["AssetName"]); + var ServiceName = getStringFromObject(entry["ServiceName"]); + var assetCIName = getStringFromObject(entry["AssetCIName"]); + var subject = getStringFromObject(entry["Subject"]); + + var stateData = GetActivityState(activityEOId); + var state = stateData.Item1; + var stateDisp = stateData.Item2; + + LogEntry($"Activity found {i + 1}/{activityTable.Rows.Count}: ObjectID={activityEOId}, TicketNumber={ticketNumber}, Subject={subject}, State={state}", LogLevels.Debug); + + if (string.IsNullOrEmpty(ticketNumber)) + { + LogEntry($"No TicketNumber found for activity entry", LogLevels.Warning); + continue; + } + + if (string.IsNullOrEmpty(assetName)) + { + LogEntry($"No AssetName found for activity entry", LogLevels.Debug); + } + + if (string.IsNullOrEmpty(assetCIName)) + { + LogEntry($"No AssetCIName found for activity entry", LogLevels.Debug); + } + var ServiceId = getGuidFromObject(entry["ServiceId"]); + if (ServiceId == Guid.Empty) + { + LogEntry($"no ServiceId found for activity entry", LogLevels.Debug); + } + var AssetCIName = getStringFromObject(entry["AssetCIName"]); + if (AssetCIName == string.Empty) + { + LogEntry($"no AssetCIName found for activity entry", LogLevels.Debug); + } + var Subject = getStringFromObject(entry["Subject"]); + if (Subject == string.Empty) + { + LogEntry($"no Subject found for activity entry", LogLevels.Warning); + continue; + } + var IsPrimaryAccount = getIntFromObject(entry["IsPrimaryAccount"]); + + if (string.IsNullOrEmpty(subject)) + { + LogEntry($"No Subject found for activity entry", LogLevels.Warning); + continue; + } + + tickets.Add(new cF4SDTicketSummary() + { + TicketObjectId = activityEOId, + Name = ticketNumber, + ActivityType = activityType, + AssetCIName = assetCIName, + AssetName = assetName, + ServiceId = ServiceId, + ServiceName = ServiceName, + StatusId = state, + Status = stateDisp, + Summary = subject, + IsPrimaryAccount = IsPrimaryAccount == 1 + }); + } + + tickets = tickets.OrderByDescending(x => x.Name).ToList(); + return tickets; + } + catch (Exception E) + { + LogException(E); + return null; + } + finally + { + LogMethodEnd(CM); + } + } + + internal async Task> getTicketListByUser(Guid userId, int hours, int queueoption, List queues) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + LogEntry($"Generating ticket list for userId: '{userId}', {hours} hours", LogLevels.Debug); + await Task.Delay(0); + + var tickets = new List(); + var activityFilter = GetActivityFilter(userId, hours, ticketAndServiceRequestEnabled(), queueoption, queues); + LogEntry($"ASql Filter: {activityFilter}"); + + var activityTable = FragmentRequestBase.SimpleLoad(SPSActivityClassBaseID, + "[Expression-ObjectID] as EOID, TicketNumber, Subject, Service.ID as ServiceId, Service.Name as ServiceName, SUBQUERY(BasicSchemaObjectType as bso, bso.Name, bso.id = base.T(SPSCommonClassBase).TypeID) as ActivityType" + + ", COALESCE(T(SPSActivityClassIncident).Asset.T(SPSComputerClassBase).Name, T(SPSActivityClassIncident).Asset.T(SPSAssetClassSIMCard).PhoneNumber, T(SPSActivityClassIncident).Asset.Name, T(SPSActivityClassIncident).Asset.objectid) as AssetName" + + ", SUBQUERY(BasicSchemaObjectType AS t, t.Name, t.ID=base.T(SPSActivityClassIncident).Asset.T(SPSCommonClassBase).TypeID) as AssetCIName", + activityFilter); + + if (activityTable?.Rows == null || activityTable.Rows.Count == 0) + { + LogEntry($"No activity entries found for userId: '{userId}'", LogLevels.Warning); + return null; + } + + for (int i = 0; i < activityTable.Rows.Count; i++) + { + DataRow entry = activityTable.Rows[i]; + var activityEOId = getGuidFromObject(entry["EOID"]); + var ticketNumber = getStringFromObject(entry["TicketNumber"]); + var activityType = getStringFromObject(entry["ActivityType"]); + var assetName = getStringFromObject(entry["AssetName"]); + var ServiceName = getStringFromObject(entry["ServiceName"]); + var assetCIName = getStringFromObject(entry["AssetCIName"]); + var subject = getStringFromObject(entry["Subject"]); + + var stateData = GetActivityState(activityEOId); + var state = stateData.Item1; + var stateDisp = stateData.Item2; + + LogEntry($"Activity found {i + 1}/{activityTable.Rows.Count}: ObjectID={activityEOId}, TicketNumber={ticketNumber}, Subject={subject}, State={state}", LogLevels.Debug); + + if (string.IsNullOrEmpty(ticketNumber)) + { + LogEntry($"No TicketNumber found for activity entry", LogLevels.Warning); + continue; + } + + if (string.IsNullOrEmpty(assetName)) + { + LogEntry($"No AssetName found for activity entry", LogLevels.Debug); + } + + if (string.IsNullOrEmpty(assetCIName)) + { + LogEntry($"No AssetCIName found for activity entry", LogLevels.Debug); + } + var ServiceId = getGuidFromObject(entry["ServiceId"]); + if (ServiceId == Guid.Empty) + { + LogEntry($"no ServiceId found for activity entry", LogLevels.Debug); + } + var AssetCIName = getStringFromObject(entry["AssetCIName"]); + if (AssetCIName == string.Empty) + { + LogEntry($"no AssetCIName found for activity entry", LogLevels.Debug); + } + var Subject = getStringFromObject(entry["Subject"]); + if (Subject == string.Empty) + { + LogEntry($"no Subject found for activity entry", LogLevels.Warning); + continue; + } + + if (string.IsNullOrEmpty(subject)) + { + LogEntry($"No Subject found for activity entry", LogLevels.Warning); + continue; + } + + tickets.Add(new cF4SDTicketSummary() + { + TicketObjectId = activityEOId, + Name = ticketNumber, + ActivityType = activityType, + AssetCIName = assetCIName, + AssetName = assetName, + ServiceId = ServiceId, + ServiceName = ServiceName, + StatusId = state, + Status = stateDisp, + Summary = subject, + IsPrimaryAccount = true + }); + } + + tickets = tickets.OrderByDescending(x => x.Name).ToList(); + return tickets; + } + catch (Exception E) + { + LogException(E); + return null; + } + finally + { + LogMethodEnd(CM); + } + } + + private static readonly string[] TicketOverviewKeys = new[] + { + "TicketsNew", + "TicketsActive", + "TicketsCritical", + "TicketsNewInfo", + "IncidentNew", + "IncidentActive", + "IncidentCritical", + "IncidentNewInfo", + "UnassignedTickets", + "UnassignedTicketsCritical" + }; + + public class cF4SDTicket : cF4SDTicketSummary + { + public enum enumTicketCreationSource + { + Unknown = 0, + Mail = 1, + Phone = 2, + F4SD = 3 + } + + public class cTicketJournalItem + { + public DateTime CreationDate { get; set; } + public string Header { get; set; } + public string CreatedBy { get; set; } + public string DescriptionHtml { get; set; } + public string Description { get; set; } + public bool IsVisibleForUser { get; set; } + public Guid ActivityObjectId { get; set; } + public Guid JournalId { get; set; } + } + + public Guid AffectedUserId { get; set; } + public Guid AssetId { get; set; } + public DateTime CreationDate { get; set; } + public DateTime? ClosingDate { get; set; } + public int CreationSourceId { get; set; } + public string CreationSource { get; set; } + + public string Description { get; set; } + public string DescriptionHtml { get; set; } + public int PriorityId { get; set; } + public string Priority { get; set; } + public Guid CategoryId { get; set; } + public string Category { get; set; } + public string CategoryHierarchical { get; set; } + public string CIName { get; set; } + public string DirectLinkEdit { get; set; } + public Guid AssetCIId { get; set; } + public int AssetSKUAssetGroupId { get; set; } + public string AssetSKUAssetGroup { get; set; } + public int AssetSKUTypeId { get; set; } + public string AssetSKUType { get; set; } + public string DirectLinkPreview { get; set; } + public string DirectLinkClose { get; set; } + public string AffectedUser { get; set; } + public string SolutionHtml { get; set; } + public string Solution { get; set; } + public string AssetDomain { get; set; } + public string Urgency { get; set; } + public int UrgencyId { get; set; } + public string Impact { get; set; } + public int ImpactId { get; set; } + + } + + public class TicketOverviewCountsResult + { + [JsonProperty("counts")] + public Dictionary Counts { get; set; } = new Dictionary(StringComparer.OrdinalIgnoreCase); + } + + public class TicketOverviewCountsByRoleResult + { + [JsonProperty("generatedAtUtc")] + public DateTime GeneratedAtUtc { get; set; } = DateTime.UtcNow; + + [JsonProperty("countsByRole")] + public Dictionary> CountsByRole { get; set; } + = new Dictionary>(StringComparer.OrdinalIgnoreCase); + } + + public class TicketOverviewRelationDto + { + public enumF4sdSearchResultClass Type { get; set; } + public string Name { get; set; } + public string DisplayName { get; set; } + public Guid id { get; set; } + public enumF4sdSearchResultStatus Status { get; set; } = enumF4sdSearchResultStatus.Unknown; + public Dictionary Infos { get; set; } = null; + public List Identities { get; set; } = null; + } + + private sealed class TicketOverviewEntry + { + public Guid TicketId { get; set; } + public string TicketNumber { get; set; } + public string Summary { get; set; } + public Guid InitiatorId { get; set; } + public string InitiatorDisplayName { get; set; } + public string InitiatorAccount { get; set; } + public string InitiatorDomain { get; set; } + public string InitiatorSid { get; set; } + public Guid RecipientId { get; set; } + public Guid RecipientRoleId { get; set; } + public int State { get; set; } + public DateTime CreatedDate { get; set; } + public bool NewInformationReceived { get; set; } + public bool ReactionTimeEscalated { get; set; } + public bool SolutionTimeEscalated { get; set; } + public bool IsIncident { get; set; } + public string ActivityType { get; set; } + } + + [Obsolete] + internal async Task getTicketOverviewCounts( + string sid, + string scope, + IEnumerable keys, + int queueoption, + List queues) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + var useRoleScope = string.Equals(scope, "role", StringComparison.OrdinalIgnoreCase); + var normalizedKeys = (keys ?? Array.Empty()) + .Where(k => !string.IsNullOrWhiteSpace(k)) + .Distinct(StringComparer.OrdinalIgnoreCase) + .ToList(); + + if (normalizedKeys.Count == 0) + { + normalizedKeys.AddRange(TicketOverviewKeys); + } + + var entries = await LoadTicketOverviewEntries(sid, useRoleScope, queueoption, queues); + List unassignedEntries = null; + if (!useRoleScope && normalizedKeys.Any(IsUnassignedOverviewKey)) + { + unassignedEntries = await LoadTicketOverviewUnassignedEntriesForPersonalScope(sid, queueoption, queues); + } + + var counts = new Dictionary(StringComparer.OrdinalIgnoreCase); + + foreach (var key in normalizedKeys) + { + if (!useRoleScope && IsUnassignedOverviewKey(key)) + { + counts[key] = (unassignedEntries ?? new List()) + .Count(entry => MatchesTicketOverviewKey(entry, key)); + } + else + { + counts[key] = entries.Count(entry => MatchesTicketOverviewKey(entry, key)); + } + } + + return new TicketOverviewCountsResult { Counts = counts }; + } + catch (Exception E) + { + LogException(E); + return new TicketOverviewCountsResult(); + } + finally + { + LogMethodEnd(CM); + } + } + + internal async Task getTicketOverviewCounts( + Guid userId, + string scope, + IEnumerable keys, + int queueoption, + List queues) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + var useRoleScope = string.Equals(scope, "role", StringComparison.OrdinalIgnoreCase); + var normalizedKeys = (keys ?? Array.Empty()) + .Where(k => !string.IsNullOrWhiteSpace(k)) + .Distinct(StringComparer.OrdinalIgnoreCase) + .ToList(); + + if (normalizedKeys.Count == 0) + { + normalizedKeys.AddRange(TicketOverviewKeys); + } + + var entries = await LoadTicketOverviewEntries(userId, useRoleScope, queueoption, queues); + List unassignedEntries = null; + if (!useRoleScope && normalizedKeys.Any(IsUnassignedOverviewKey)) + { + unassignedEntries = await LoadTicketOverviewUnassignedEntriesForPersonalScope(userId, queueoption, queues); + } + + var counts = new Dictionary(StringComparer.OrdinalIgnoreCase); + + foreach (var key in normalizedKeys) + { + if (!useRoleScope && IsUnassignedOverviewKey(key)) + { + counts[key] = (unassignedEntries ?? new List()) + .Count(entry => MatchesTicketOverviewKey(entry, key)); + } + else + { + counts[key] = entries.Count(entry => MatchesTicketOverviewKey(entry, key)); + } + } + + return new TicketOverviewCountsResult { Counts = counts }; + } + catch (Exception E) + { + LogException(E); + return new TicketOverviewCountsResult(); + } + finally + { + LogMethodEnd(CM); + } + } + + [Obsolete] + internal async Task getTicketOverviewCountsByRoles( + string sid, + IEnumerable roleGuids, + IEnumerable keys, + int queueoption, + List queues) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + var normalizedKeys = (keys ?? Array.Empty()) + .Where(k => !string.IsNullOrWhiteSpace(k)) + .Distinct(StringComparer.OrdinalIgnoreCase) + .ToList(); + + if (normalizedKeys.Count == 0) + { + normalizedKeys.AddRange(TicketOverviewKeys); + } + + var roleIds = await ResolveTicketOverviewRoleIdsAsync(sid, roleGuids); + if (roleIds.Count == 0) + return new TicketOverviewCountsByRoleResult(); + + var entries = await LoadTicketOverviewEntriesByRoleIds(roleIds, queueoption, queues); + var entriesByRole = entries + .GroupBy(entry => entry.RecipientRoleId) + .ToDictionary(group => group.Key, group => group.ToList()); + + var countsByRole = new Dictionary>(StringComparer.OrdinalIgnoreCase); + foreach (var roleId in roleIds) + { + var roleEntries = entriesByRole.TryGetValue(roleId, out var list) + ? list + : new List(); + + var counts = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var key in normalizedKeys) + { + counts[key] = roleEntries.Count(entry => MatchesTicketOverviewKey(entry, key)); + } + + countsByRole[roleId.ToString()] = counts; + } + + return new TicketOverviewCountsByRoleResult + { + GeneratedAtUtc = DateTime.UtcNow, + CountsByRole = countsByRole + }; + } + catch (Exception E) + { + LogException(E); + return new TicketOverviewCountsByRoleResult(); + } + finally + { + LogMethodEnd(CM); + } + } + + internal async Task getTicketOverviewCountsByRoles( + Guid userId, + IEnumerable roleGuids, + IEnumerable keys, + int queueoption, + List queues) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + var normalizedKeys = (keys ?? Array.Empty()) + .Where(k => !string.IsNullOrWhiteSpace(k)) + .Distinct(StringComparer.OrdinalIgnoreCase) + .ToList(); + + if (normalizedKeys.Count == 0) + { + normalizedKeys.AddRange(TicketOverviewKeys); + } + + var roleIds = await ResolveTicketOverviewRoleIdsAsync(userId, roleGuids); + if (roleIds.Count == 0) + return new TicketOverviewCountsByRoleResult(); + + var entries = await LoadTicketOverviewEntriesByRoleIds(roleIds, queueoption, queues); + var entriesByRole = entries + .GroupBy(entry => entry.RecipientRoleId) + .ToDictionary(group => group.Key, group => group.ToList()); + + var countsByRole = new Dictionary>(StringComparer.OrdinalIgnoreCase); + foreach (var roleId in roleIds) + { + var roleEntries = entriesByRole.TryGetValue(roleId, out var list) + ? list + : new List(); + + var counts = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var key in normalizedKeys) + { + counts[key] = roleEntries.Count(entry => MatchesTicketOverviewKey(entry, key)); + } + + countsByRole[roleId.ToString()] = counts; + } + + return new TicketOverviewCountsByRoleResult + { + GeneratedAtUtc = DateTime.UtcNow, + CountsByRole = countsByRole + }; + } + catch (Exception E) + { + LogException(E); + return new TicketOverviewCountsByRoleResult(); + } + finally + { + LogMethodEnd(CM); + } + } + + [Obsolete] + internal async Task> getTicketOverviewRelations( + string sid, + string scope, + string key, + int count, + int queueoption, + List queues) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + if (string.IsNullOrWhiteSpace(key)) + return new List(); + + var useRoleScope = string.Equals(scope, "role", StringComparison.OrdinalIgnoreCase); + List entries; + if (!useRoleScope && IsUnassignedOverviewKey(key)) + { + entries = await LoadTicketOverviewUnassignedEntriesForPersonalScope(sid, queueoption, queues); + } + else + { + entries = await LoadTicketOverviewEntries(sid, useRoleScope, queueoption, queues); + } + + var filtered = entries + .Where(entry => MatchesTicketOverviewKey(entry, key)) + .OrderByDescending(entry => entry.CreatedDate) + .ToList(); + + if (count > 0) + filtered = filtered.Take(count).ToList(); + + var relations = new List(filtered.Count); + foreach (var entry in filtered) + { + var relation = new TicketOverviewRelationDto + { + Type = enumF4sdSearchResultClass.Ticket, + DisplayName = entry.TicketNumber ?? string.Empty, + Name = entry.TicketNumber ?? string.Empty, + id = entry.TicketId, + Status = enumF4sdSearchResultStatus.Active, + Infos = new Dictionary + { + ["Summary"] = entry.Summary ?? string.Empty, + ["StatusId"] = ConvertM42State(entry.State), + ["ActivityType"] = entry.ActivityType ?? string.Empty, + ["UserDisplayName"] = entry.InitiatorDisplayName ?? string.Empty, + ["UserAccount"] = entry.InitiatorAccount ?? string.Empty, + ["UserDomain"] = entry.InitiatorDomain ?? string.Empty, + ["UserSid"] = entry.InitiatorSid ?? string.Empty, + ["Sids"] = entry.InitiatorSid ?? string.Empty, + ["UserId"] = entry.InitiatorId != Guid.Empty ? entry.InitiatorId.ToString() : string.Empty, + ["UserGuid"] = entry.InitiatorId != Guid.Empty ? entry.InitiatorId.ToString() : string.Empty + }, + Identities = new List + { + new cF4sdIdentityEntry { Class = enumFasdInformationClass.Ticket, Id = entry.TicketId }, + new cF4sdIdentityEntry { Class = enumFasdInformationClass.User, Id = entry.InitiatorId } + } + }; + relations.Add(relation); + } + + return relations; + } + catch (Exception E) + { + LogException(E); + return new List(); + } + finally + { + LogMethodEnd(CM); + } + } + + internal async Task> getTicketOverviewRelations( + Guid userId, + string scope, + string key, + int count, + int queueoption, + List queues) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + if (string.IsNullOrWhiteSpace(key)) + return new List(); + + var useRoleScope = string.Equals(scope, "role", StringComparison.OrdinalIgnoreCase); + List entries; + if (!useRoleScope && IsUnassignedOverviewKey(key)) + { + entries = await LoadTicketOverviewUnassignedEntriesForPersonalScope(userId, queueoption, queues); + } + else + { + entries = await LoadTicketOverviewEntries(userId, useRoleScope, queueoption, queues); + } + + var filtered = entries + .Where(entry => MatchesTicketOverviewKey(entry, key)) + .OrderByDescending(entry => entry.CreatedDate) + .ToList(); + + if (count > 0) + filtered = filtered.Take(count).ToList(); + + var relations = new List(filtered.Count); + foreach (var entry in filtered) + { + var relation = new TicketOverviewRelationDto + { + Type = enumF4sdSearchResultClass.Ticket, + DisplayName = entry.TicketNumber ?? string.Empty, + Name = entry.TicketNumber ?? string.Empty, + id = entry.TicketId, + Status = enumF4sdSearchResultStatus.Active, + Infos = new Dictionary + { + ["Summary"] = entry.Summary ?? string.Empty, + ["StatusId"] = ConvertM42State(entry.State), + ["ActivityType"] = entry.ActivityType ?? string.Empty, + ["UserDisplayName"] = entry.InitiatorDisplayName ?? string.Empty, + ["UserAccount"] = entry.InitiatorAccount ?? string.Empty, + ["UserDomain"] = entry.InitiatorDomain ?? string.Empty, + ["UserSid"] = entry.InitiatorSid ?? string.Empty, + ["Sids"] = entry.InitiatorSid ?? string.Empty, + ["UserId"] = entry.InitiatorId != Guid.Empty ? entry.InitiatorId.ToString() : string.Empty, + ["UserGuid"] = entry.InitiatorId != Guid.Empty ? entry.InitiatorId.ToString() : string.Empty + }, + Identities = new List + { + new cF4sdIdentityEntry { Class = enumFasdInformationClass.Ticket, Id = entry.TicketId }, + new cF4sdIdentityEntry { Class = enumFasdInformationClass.User, Id = entry.InitiatorId } + } + }; + relations.Add(relation); + } + + return relations; + } + catch (Exception E) + { + LogException(E); + return new List(); + } + finally + { + LogMethodEnd(CM); + } + } + + [Obsolete] + private async Task> LoadTicketOverviewEntries( + string sid, + bool useRoleScope, + int queueoption, + List queues) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + await Task.Delay(0); + + if (string.IsNullOrWhiteSpace(sid)) + return new List(); + + var filter = await BuildTicketOverviewFilterAsync(sid, useRoleScope, queueoption, queues); + return await LoadTicketOverviewEntriesByFilter(filter); + } + catch (Exception E) + { + LogException(E); + return new List(); + } + finally + { + LogMethodEnd(CM); + } + } + + private async Task> LoadTicketOverviewEntries( + Guid userId, + bool useRoleScope, + int queueoption, + List queues) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + if (userId == Guid.Empty) + return new List(); + + var filter = await BuildTicketOverviewFilterAsync(userId, useRoleScope, queueoption, queues); + return await LoadTicketOverviewEntriesByFilter(filter); + } + catch (Exception E) + { + LogException(E); + return new List(); + } + finally + { + LogMethodEnd(CM); + } + } + + [Obsolete] + private async Task> LoadTicketOverviewUnassignedEntriesForPersonalScope( + string sid, + int queueoption, + List queues) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + await Task.Delay(0); + + if (string.IsNullOrWhiteSpace(sid)) + return new List(); + + var roleIds = await ResolveTicketOverviewRoleIdsAsync(sid, null); + var filter = BuildTicketOverviewFilterForRoleIds(roleIds, null, queueoption, queues); + if (string.IsNullOrWhiteSpace(filter)) + return new List(); + + filter += " AND Recipient IS NULL"; + return await LoadTicketOverviewEntriesByFilter(filter); + } + catch (Exception E) + { + LogException(E); + return new List(); + } + finally + { + LogMethodEnd(CM); + } + } + + private async Task> LoadTicketOverviewUnassignedEntriesForPersonalScope( + Guid userId, + int queueoption, + List queues) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + await Task.Delay(0); + + if (userId == Guid.Empty) + return new List(); + + var roleIds = await ResolveTicketOverviewRoleIdsAsync(userId, null); + var filter = BuildTicketOverviewFilterForRoleIds(roleIds, null, queueoption, queues); + if (string.IsNullOrWhiteSpace(filter)) + return new List(); + + filter += " AND Recipient IS NULL"; + return await LoadTicketOverviewEntriesByFilter(filter); + } + catch (Exception E) + { + LogException(E); + return new List(); + } + finally + { + LogMethodEnd(CM); + } + } + + private async Task> LoadTicketOverviewEntriesByRoleIds( + IEnumerable roleIds, + int queueoption, + List queues) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + await Task.Delay(0); + + var filter = BuildTicketOverviewFilterForRoleIds(roleIds, null, queueoption, queues); + return await LoadTicketOverviewEntriesByFilter(filter); + } + catch (Exception E) + { + LogException(E); + return new List(); + } + finally + { + LogMethodEnd(CM); + } + } + + private async Task> LoadTicketOverviewEntriesByFilter(string filter) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + await Task.Delay(0); + + if (string.IsNullOrWhiteSpace(filter)) + return new List(); + + var tbl = FragmentRequestBase.SimpleLoad(SPSActivityClassBaseID, + "[Expression-ObjectID] as EOID" + + ", TicketNumber" + + ", Subject" + + ", Initiator as InitiatorId" + + ", Initiator.LastName + ISNULL(', ' + Initiator.FirstName, '') as Initiator" + + ", Initiator.PrimaryAccount.T(SPSAccountClassAD).NBAccountName as InitiatorAccount" + + ", Initiator.PrimaryAccount.T(SPSAccountClassAD).Domain.NT4Name as InitiatorDomain" + + ", Initiator.PrimaryAccount.T(SPSAccountClassAD).Sid as InitiatorSid" + + ", Recipient as RecipientId" + + ", RecipientRole.T(SPSSecurityClassRole).ID as RecipientRoleId" + + ", T(SPSCommonClassBase).State as State" + + ", CreatedDate" + + ", NewInformationReceived" + + ", ReactionTimeEscalated" + + ", SolutionTimeEscalated" + + ", UsedInTypeSPSActivityTypeTicket as TicketEoid" + + ", UsedInTypeSPSActivityTypeIncident as IncidentEoid" + + ", UsedInTypeSPSActivityTypeAlert as AlertEoid" + + ", UsedInTypeSPSActivityTypeGroupTicket as ProblemEoid" + + ", UsedInTypeSPSActivityTypeServiceRequest as ServiceRequestEoid" + + ", UsedInTypeSPSActivityTypeBase as TaskEoid" + + ", UsedInTypeSVMChangeRequestType as ChangeEoid", + filter); + + if (tbl?.Rows == null || tbl.Rows.Count == 0) + return new List(); + + var entries = new List(tbl.Rows.Count); + foreach (DataRow row in tbl.Rows) + { + var ticketId = getGuidFromObject(row["EOID"]); + if (ticketId == Guid.Empty) + continue; + + var ticketEoid = getGuidFromObject(row["TicketEoid"]); + var incidentEoid = getGuidFromObject(row["IncidentEoid"]); + var alertEoid = getGuidFromObject(row["AlertEoid"]); + var problemEoid = getGuidFromObject(row["ProblemEoid"]); + var serviceRequestEoid = getGuidFromObject(row["ServiceRequestEoid"]); + var taskEoid = getGuidFromObject(row["TaskEoid"]); + var changeEoid = getGuidFromObject(row["ChangeEoid"]); + var isIncident = incidentEoid != Guid.Empty; + var activityType = ResolveTicketOverviewActivityType( + ticketEoid, + incidentEoid, + alertEoid, + problemEoid, + serviceRequestEoid, + taskEoid, + changeEoid); + + entries.Add(new TicketOverviewEntry + { + TicketId = ticketId, + TicketNumber = getStringFromObject(row["TicketNumber"]), + Summary = getStringFromObject(row["Subject"]), + InitiatorId = getGuidFromObject(row["InitiatorId"]), + InitiatorDisplayName = getStringFromObject(row["Initiator"]), + InitiatorAccount = getStringFromObject(row["InitiatorAccount"]), + InitiatorDomain = getStringFromObject(row["InitiatorDomain"]), + InitiatorSid = getStringFromObject(row["InitiatorSid"]), + RecipientId = getGuidFromObject(row["RecipientId"]), + RecipientRoleId = getGuidFromObject(row["RecipientRoleId"]), + State = getIntFromObject(row["State"]), + CreatedDate = getDateTimeFromObject(row["CreatedDate"]), + NewInformationReceived = GetBoolValue(row["NewInformationReceived"]), + ReactionTimeEscalated = GetBoolValue(row["ReactionTimeEscalated"]), + SolutionTimeEscalated = GetBoolValue(row["SolutionTimeEscalated"]), + IsIncident = isIncident, + ActivityType = activityType + }); + } + + return entries; + } + catch (Exception E) + { + LogException(E); + return new List(); + } + finally + { + LogMethodEnd(CM); + } + } + + private static string ResolveTicketOverviewActivityType( + Guid ticketEoid, + Guid incidentEoid, + Guid alertEoid, + Guid problemEoid, + Guid serviceRequestEoid, + Guid taskEoid, + Guid changeEoid) + { + if (incidentEoid != Guid.Empty) + return "SPSActivityTypeIncident"; + if (ticketEoid != Guid.Empty) + return "SPSActivityTypeTicket"; + if (alertEoid != Guid.Empty) + return "SPSActivityTypeAlert"; + if (problemEoid != Guid.Empty) + return "SPSActivityTypeGroupTicket"; + if (serviceRequestEoid != Guid.Empty) + return "SPSActivityTypeServiceRequest"; + if (taskEoid != Guid.Empty) + return "SPSActivityTypeBase"; + if (changeEoid != Guid.Empty) + return "SVMChangeRequestType"; + + return null; + } + + [Obsolete] + private async Task BuildTicketOverviewFilterAsync( + string sid, + bool useRoleScope, + int queueoption, + List queues) + { + var filter = BuildTicketOverviewBaseFilter(queueoption, queues); + + if (!useRoleScope) + { + var recipientFilter = $"Recipient.Accounts.T(SPSAccountClassAd).Sid = '{Escape(sid)}'"; + filter += $" AND ({recipientFilter})"; + return filter; + } + + var roleIds = await ResolveTicketOverviewRoleIdsAsync(sid, null); + return BuildTicketOverviewFilterForRoleIds(roleIds, filter); + } + + private async Task BuildTicketOverviewFilterAsync( + Guid userId, + bool useRoleScope, + int queueoption, + List queues) + { + var filter = BuildTicketOverviewBaseFilter(queueoption, queues); + + if (!useRoleScope) + { + var recipientFilter = $"Recipient = '{Escape(userId.ToString("D"))}'"; + filter += $" AND ({recipientFilter})"; + return filter; + } + + var roleIds = await ResolveTicketOverviewRoleIdsAsync(userId, null); + return BuildTicketOverviewFilterForRoleIds(roleIds, filter); + } + + private string BuildTicketOverviewBaseFilter(int queueoption, List queues) + { + var filter = "T(SPSCommonClassBase).State <> 204"; + + if (ticketAndServiceRequestEnabled()) + { + filter += " AND (UsedInTypeSPSActivityTypeIncident IS NOT NULL" + + " OR UsedInTypeSPSActivityTypeTicket IS NOT NULL" + + " OR UsedInTypeSPSActivityTypeServiceRequest IS NOT NULL)"; + } + else + { + filter += " AND (UsedInTypeSPSActivityTypeIncident IS NOT NULL)"; + } + + filter = AppendQueueFilter(filter, queueoption, queues); + return filter; + } + + private string BuildTicketOverviewFilterForRoleIds( + IEnumerable roleIds, + string baseFilter = null, + int queueoption = 0, + List queues = null) + { + var filter = string.IsNullOrWhiteSpace(baseFilter) + ? BuildTicketOverviewBaseFilter(queueoption, queues) + : baseFilter; + + var roleClause = BuildRoleIdInClause(roleIds); + if (string.IsNullOrWhiteSpace(roleClause)) + return null; + + filter += $" AND {roleClause}"; + return filter; + } + + private static string BuildRoleIdInClause(IEnumerable roleIds) + { + var roleIdList = (roleIds ?? Enumerable.Empty()) + .Where(id => id != Guid.Empty) + .Distinct() + .Select(id => $"'{id}'") + .ToList(); + + if (roleIdList.Count == 0) + return null; + + return $"RecipientRole.T(SPSSecurityClassRole).ID IN ({string.Join(", ", roleIdList)})"; + } + + private string AppendQueueFilter(string filter, int queueoption, List queues) + { + if (queues != null && queues.Count > 0) + { + var escapedNames = queues + .Select(q => $"'{Escape(q.QueueName)}'") + .ToList(); + var escapedIds = queues + .Select(q => $"'{Escape(q.QueueID.ToString())}'") + .ToList(); + + string nameList = string.Join(", ", escapedNames); + string idList = string.Join(", ", escapedIds); + + switch (queueoption) + { + case 1: + filter += + $" AND (" + + "Queue IS NULL" + + $" OR Queue.Name IN ({nameList})" + + $" OR Queue.ID IN ({idList})" + + ")"; + break; + case 2: + filter += + $" AND (" + + "Queue IS NOT NULL" + + $" AND (Queue.Name IN ({nameList})" + + $" OR Queue.ID IN ({idList}))" + + ")"; + break; + case 3: + filter += " AND Queue IS NULL"; + break; + default: + break; + } + } + else if (queueoption == 3) + { + filter += " AND Queue IS NULL"; + } + + return filter; + } + + [Obsolete] + private async Task> ResolveTicketOverviewRoleIdsAsync(string sid, IEnumerable roleGuids) + { + var roleIds = (roleGuids ?? Enumerable.Empty()) + .Where(id => id != Guid.Empty) + .Distinct() + .ToList(); + + if (roleIds.Count > 0) + return roleIds; + + if (string.IsNullOrWhiteSpace(sid)) + return new List(); + + var userId = getUserBySid(sid); + if (userId == Guid.Empty) + return new List(); + + var roles = await getRoleMembershipById(userId) ?? new List(); + return roles + .Where(role => role != null && role.Id != Guid.Empty) + .Select(role => role.Id) + .Distinct() + .ToList(); + } + + private async Task> ResolveTicketOverviewRoleIdsAsync(Guid userId, IEnumerable roleGuids) + { + var roleIds = (roleGuids ?? Enumerable.Empty()) + .Where(id => id != Guid.Empty) + .Distinct() + .ToList(); + + if (roleIds.Count > 0) + return roleIds; + + if (userId == Guid.Empty) + return new List(); + + var roles = await getRoleMembershipById(userId) ?? new List(); + return roles + .Where(role => role != null && role.Id != Guid.Empty) + .Select(role => role.Id) + .Distinct() + .ToList(); + } + private static bool IsUnassignedOverviewKey(string key) + { + if (string.IsNullOrWhiteSpace(key)) + return false; + + switch (key.Trim()) + { + case "UnassignedTickets": + case "UnassignedTicketsCritical": + return true; + default: + return false; + } + } + + private static bool MatchesTicketOverviewKey(TicketOverviewEntry entry, string key) + { + if (entry == null || string.IsNullOrWhiteSpace(key)) + return false; + + var isTicket = !entry.IsIncident; + var hasPerson = entry.RecipientId != Guid.Empty; + var hasRole = entry.RecipientRoleId != Guid.Empty; + var isCritical = entry.ReactionTimeEscalated || entry.SolutionTimeEscalated; + var isNew = entry.State == 200; + var isActive = entry.State == 201 || entry.State == 202 || entry.State == 203; + + switch (key.Trim()) + { + case "TicketsNew": + return isTicket && (entry.State == 200 || entry.State == 201); + case "TicketsActive": + return isTicket && isActive; + case "TicketsCritical": + return isTicket && isCritical; + case "TicketsNewInfo": + return isTicket && entry.NewInformationReceived; + case "IncidentNew": + return entry.IsIncident && (entry.State == 200 || entry.State == 201); + case "IncidentActive": + return entry.IsIncident && isActive; + case "IncidentCritical": + return entry.IsIncident && isCritical; + case "IncidentNewInfo": + return entry.IsIncident && entry.NewInformationReceived; + case "UnassignedTickets": + return !hasPerson && hasRole && isNew; + case "UnassignedTicketsCritical": + return !hasPerson && hasRole && isCritical; + default: + return false; + } + } + + private static bool GetBoolValue(object value) + { + if (value == null || value is DBNull) + return false; + if (value is bool boolValue) + return boolValue; + if (value is int intValue) + return intValue != 0; + if (value is long longValue) + return longValue != 0; + + if (bool.TryParse(value.ToString(), out var parsedBool)) + return parsedBool; + if (int.TryParse(value.ToString(), out var parsedInt)) + return parsedInt != 0; + + return false; + } + + private static string ConvertM42State(int state) + { + switch (state) + { + case 200: + return "New"; + case 201: + case 202: + return "InProgress"; + case 203: + return "OnHold"; + case 204: + return "Closed"; + default: + return "Unknown"; + } + } + private (int, string) GetActivityState(Guid activityEOId) + { + var tbl3 = FragmentRequestBase.SimpleLoad(SPSCommonClassBaseID, + "State.Value as State, State.DisplayString as StateDisp", $"[Expression-ObjectID] = '{activityEOId}'"); + if (tbl3?.Rows == null || tbl3.Rows.Count <= 0) + { + LogEntry($"SPSCommonClassBase fragment not found: ClassId={SPSCommonClassBaseID}, ObjectId={activityEOId}", LogLevels.Debug); + return (0, ""); + } + var state = getIntFromObject(tbl3.Rows[0]["State"]); + var stateDisp = getStringFromObject(tbl3.Rows[0]["StateDisp"]); + return (state, stateDisp); + } + private string Escape(string input) + { + return input?.Replace("'", "''"); + } + + [Obsolete] + private string GetActivityFilter( + string userSid, + int hours, + bool ticketAndServiceRequestEnabled, + int queueoption, + List queues + ) + { + // Baseline-Filter auf User und Datum + var filter = $"Initiator.Accounts.T(SPSAccountClassAd).Sid = '{Escape(userSid)}'"; + + string fStartDate = AsqlHelper.PrepareDateTime(DateTime.UtcNow.AddHours(-hours), true); + string fEndDate = AsqlHelper.PrepareDateTime(DateTime.UtcNow, true); + + // Incident vs. Ticket/ServiceRequest + if (ticketAndServiceRequestEnabled) + { + filter += + " AND (UsedInTypeSPSActivityTypeIncident IS NOT NULL" + + " OR UsedInTypeSPSActivityTypeTicket IS NOT NULL" + + " OR UsedInTypeSPSActivityTypeServiceRequest IS NOT NULL)"; + } + else + { + filter += " AND (UsedInTypeSPSActivityTypeIncident IS NOT NULL)"; + } + + // Offene bzw. kürzlich geschlossene Objekte + filter += + " AND (T(SPSCommonClassBase).State <> 204" + + $" OR (ClosedDate > {fStartDate} AND ClosedDate < {fEndDate}))"; + + // Queue-Filter nur, wenn tatsächlich Queues übergeben wurden + if (queues != null && queues.Count > 0) + { + // URL-escaping für Name und ID + var escapedNames = queues + .Select(q => $"'{Escape(q.QueueName)}'") + .ToList(); + var escapedIds = queues + .Select(q => $"'{Escape(q.QueueID.ToString())}'") + .ToList(); + + string nameList = string.Join(", ", escapedNames); + string idList = string.Join(", ", escapedIds); + + switch (queueoption) + { + // 1 = entweder keine Queue oder eine der übergebenen Queues (Name oder ID) + case 1: + filter += + $" AND (" + + "Queue IS NULL" + + $" OR Queue.Name IN ({nameList})" + + $" OR Queue.ID IN ({idList})" + + ")"; + break; + + // 2 = nur die übergebenen Queues (Name oder ID) + case 2: + filter += + $" AND (" + + "Queue IS NOT NULL" + + $" AND (Queue.Name IN ({nameList})" + + $" OR Queue.ID IN ({idList}))" + + ")"; + break; + + // 3 = nur Objekte ohne Queue + case 3: + filter += " AND Queue IS NULL"; + break; + + // 0 oder andere = keine zusätzliche Einschränkung + default: + break; + } + } + else if (queueoption == 3) + { + // Ausnahme: wenn keine Queues übergeben, aber Option 3 = nur ohne Queue + filter += " AND Queue IS NULL"; + } + + return filter; + } + + private string GetActivityFilter( + Guid userId, + int hours, + bool ticketAndServiceRequestEnabled, + int queueoption, + List queues + ) + { + // Baseline-Filter auf User und Datum + var filter = $"Initiator = '{Escape(userId.ToString("D"))}'"; + + string fStartDate = AsqlHelper.PrepareDateTime(DateTime.UtcNow.AddHours(-hours), true); + string fEndDate = AsqlHelper.PrepareDateTime(DateTime.UtcNow, true); + + // Incident vs. Ticket/ServiceRequest + if (ticketAndServiceRequestEnabled) + { + filter += + " AND (UsedInTypeSPSActivityTypeIncident IS NOT NULL" + + " OR UsedInTypeSPSActivityTypeTicket IS NOT NULL" + + " OR UsedInTypeSPSActivityTypeServiceRequest IS NOT NULL)"; + } + else + { + filter += " AND (UsedInTypeSPSActivityTypeIncident IS NOT NULL)"; + } + + // Offene bzw. kürzlich geschlossene Objekte + filter += + " AND (T(SPSCommonClassBase).State <> 204" + + $" OR (ClosedDate > {fStartDate} AND ClosedDate < {fEndDate}))"; + + // Queue-Filter nur, wenn tatsächlich Queues übergeben wurden + if (queues != null && queues.Count > 0) + { + // URL-escaping für Name und ID + var escapedNames = queues + .Select(q => $"'{Escape(q.QueueName)}'") + .ToList(); + var escapedIds = queues + .Select(q => $"'{Escape(q.QueueID.ToString())}'") + .ToList(); + + string nameList = string.Join(", ", escapedNames); + string idList = string.Join(", ", escapedIds); + + switch (queueoption) + { + // 1 = entweder keine Queue oder eine der übergebenen Queues (Name oder ID) + case 1: + filter += + $" AND (" + + "Queue IS NULL" + + $" OR Queue.Name IN ({nameList})" + + $" OR Queue.ID IN ({idList})" + + ")"; + break; + + // 2 = nur die übergebenen Queues (Name oder ID) + case 2: + filter += + $" AND (" + + "Queue IS NOT NULL" + + $" AND (Queue.Name IN ({nameList})" + + $" OR Queue.ID IN ({idList}))" + + ")"; + break; + + // 3 = nur Objekte ohne Queue + case 3: + filter += " AND Queue IS NULL"; + break; + + // 0 oder andere = keine zusätzliche Einschränkung + default: + break; + } + } + else if (queueoption == 3) + { + // Ausnahme: wenn keine Queues übergeben, aber Option 3 = nur ohne Queue + filter += " AND Queue IS NULL"; + } + + return filter; + } + + internal async Task getDirectLinkCreateTicket(string sid, string assetname) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + await Task.Delay(0); + + // get global settings + bool TicketAndServiceRequestEnabled = ticketAndServiceRequestEnabled(); + + var user = getUserBySid(sid); + var asset = getAssetByName(assetname); + dynamic presetParamsDyn = new ExpandoObject(); + + presetParamsDyn.SPSActivityClassBase = new ExpandoObject(); + presetParamsDyn.SPSActivityClassBase.Subject = placeHolderSubject; + presetParamsDyn.SPSActivityClassBase.DescriptionHTML = placeHolderDescription; + if (user != Guid.Empty) + presetParamsDyn.SPSActivityClassBase.Initiator = user; + if (asset != null) + { + presetParamsDyn.SPSActivityClassIncident = new ExpandoObject(); + presetParamsDyn.SPSActivityClassIncident.Asset = asset.Id; + } + var type = TicketAndServiceRequestEnabled ? "SPSActivityTypeTicket" : "SPSActivityTypeIncident"; + var presetParams = WebUtility.UrlEncode(JsonConvert.SerializeObject(presetParamsDyn)); + var directLink = string.Format(TicketDirectLinkCreateTemplate, F4SDM42WebApiController.defaultInstance.BaseUrl, type, presetParams); + return new DirectLink() + { + Link = directLink, + DescriptionParameter = placeHolderDescription, + SubjectParameter = placeHolderSubject + }; + } + catch (Exception E) + { + LogException(E); + return null; + } + finally + { + LogMethodEnd(CM); + } + } + + private static bool ticketAndServiceRequestEnabled() + { + if (ticketAndServiceRequestEnabledCache.HasValue) + return ticketAndServiceRequestEnabledCache.Value; + + try + { + var configProvider = F4SDM42WebApiController.defaultInstance?._globalConfigurationProvider; + var enabled = configProvider?.ServiceDeskConfiguration?.TicketAndServiceRequestEnabled ?? true; + ticketAndServiceRequestEnabledCache = enabled; + return enabled; + } + catch (Exception E) + { + LogException(E); + LogEntry("Could not read ServiceDeskConfiguration.TicketAndServiceRequestEnabled. Falling back to enabled ticket/service request mode.", LogLevels.Warning); + ticketAndServiceRequestEnabledCache = true; + return true; + } + } + + internal async Task> getTicketDetails(List ticketObjectIds) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + await Task.Delay(0); + + var Filter = AsqlHelper.BuildInCondition("[Expression-ObjectId]", ticketObjectIds); + LogEntry($"ASql Filter: {Filter}"); + + var tbl = FragmentRequestBase.SimpleLoad(SPSActivityClassBaseID, + "[Expression-ObjectId] as EOID" + + ", TicketNumber" + + ", Subject" + + ", Category.Name as Category" + + ", Category as CategoryId" + + ", CreatedDate, ClosedDate" + + ", Initiator as InitiatorId" + + ", Initiator.LastName + ISNULL(', ' + Initiator.FirstName, '') as Initiator" + + ", DescriptionHTML" + + ", Impact" + + ", Impact.DisplayString as ImpactDisp" + + ", Urgency" + + ", Urgency.DisplayString as UrgencyDisp" + + ", Priority" + + ", Priority.Description as PrioDisp" + + ", SolutionHTML", Filter); + + if (tbl == null || tbl.Rows == null) + { + LogEntry($"No activity entry list found with [Expression-ObjectId]='{string.Join(", ", ticketObjectIds)}'", LogLevels.Warning); + return null; + } + + var tickets = new List(); + + foreach (DataRow Entry in tbl.Rows) + { + var ActivityEOID = getGuidFromObject(Entry["EOID"]); + if (ActivityEOID == Guid.Empty) + { + LogEntry($"No expression object id found for activity entry", LogLevels.Warning); + continue; + } + + var InitiatorId = getGuidFromObject(Entry["InitiatorId"]); + var Initiator = getStringFromObject(Entry["Initiator"]); + if (InitiatorId == Guid.Empty) + { + LogEntry($"No Initiator id found for activity entry", LogLevels.Warning); + } + + var TicketNumber = getStringFromObject(Entry["TicketNumber"]); + if (string.IsNullOrEmpty(TicketNumber)) + { + LogEntry($"No TicketNumber found for activity entry", LogLevels.Warning); + continue; + } + + var CategoryId = getGuidFromObject(Entry["CategoryId"]); + if (CategoryId == Guid.Empty) + { + LogEntry($"No Initiator object id found for activity entry", LogLevels.Warning); + continue; + } + + var Category = getStringFromObject(Entry["Category"]); + if (string.IsNullOrEmpty(Category)) + { + LogEntry($"No Category found for activity entry", LogLevels.Warning); + continue; + } + + var CreatedDate = getDateTimeFromObject(Entry["CreatedDate"]); + if (CreatedDate == DateTime.MinValue) + { + LogEntry($"No CreationDate found for activity entry", LogLevels.Warning); + continue; + } + + var ClosedDate = getDateTimeFromObject(Entry["ClosedDate"]); + var DescriptionHtml = getStringFromObject(Entry["DescriptionHTML"]); + var Description = DescriptionHtml != string.Empty ? Matrix42.Common.Html.HtmlConverter.ConvertHtmlToPlainText(DescriptionHtml) : string.Empty; + + var SolutionHtml = getStringFromObject(Entry["SolutionHTML"]); + var Solution = SolutionHtml != string.Empty ? Matrix42.Common.Html.HtmlConverter.ConvertHtmlToPlainText(SolutionHtml) : string.Empty; + + var Subject = getStringFromObject(Entry["Subject"]); + if (string.IsNullOrEmpty(Subject)) + { + LogEntry($"No Subject found for activity entry", LogLevels.Warning); + continue; + } + + var PriorityId = getIntFromObject(Entry["Priority"]); + var Priority = getStringFromObject(Entry["PrioDisp"]); + + var UrgencyId = getIntFromObject(Entry["Urgency"]); + var Urgency = getStringFromObject(Entry["UrgencyDisp"]); + + var ImpactId = getIntFromObject(Entry["Impact"]); + var Impact = getStringFromObject(Entry["ImpactDisp"]); + + LogEntry($"get category information: {Filter}"); + Filter = string.Format("Recursive(Children).T(SPSScCategoryClassBase).Id='{0}'", CategoryId); + var tbl1 = FragmentRequestBase.SimpleLoad(SPSScCategoryClassBaseID, "Name", Filter); + if (tbl1?.Rows == null || tbl1.Rows.Count <= 0) + { + LogEntry($"No Category entry list found with Initiator='{CategoryId}'", LogLevels.Warning); + return null; + } + + var CategoryHierarchical = string.Join(" > ", tbl1.Rows.Cast().Reverse().Select(row => getStringFromObject(row["Name"]))); + + var tbl2 = FragmentRequestBase.SimpleLoad(SPSActivityClassIncidentID, "EntryBy as EntryBy, EntryBy.DisplayString as EntryByDisp, COALESCE(AssetAffected, Asset) as Asset, COALESCE(AssetAffected.T(SPSComputerClassAD).Domain.NT4Name, Asset.T(SPSComputerClassAD).Domain.NT4Name) as AssetDomain, COALESCE(COALESCE(AssetAffected.T(SPSComputerClassBase).Name, AssetAffected.T(SPSAssetClassSIMCard).PhoneNumber, AssetAffected.Name, AssetAffected.objectid), COALESCE(Asset.T(SPSComputerClassBase).Name, Asset.T(SPSAssetClassSIMCard).PhoneNumber, Asset.Name, Asset.objectid)) as AssetName", $"[Expression-ObjectID] = '{ActivityEOID}'"); + + if (tbl2?.Rows == null || tbl2.Rows.Count <= 0) + { + LogEntry($"SPSActivityClassIncident fragment not found: ClassId={SPSActivityClassIncidentID}, ObjectId={ActivityEOID}", LogLevels.Debug); + continue; + } + + var AssetId = getGuidFromObject(tbl2.Rows[0]["Asset"]); + var Asset = getStringFromObject(tbl2.Rows[0]["AssetName"]); + var AssetDomain = getStringFromObject(tbl2.Rows[0]["AssetDomain"]); + var EntryBy = getIntFromObject(tbl2.Rows[0]["EntryBy"]); + var EntryByDisp = getStringFromObject(tbl2.Rows[0]["EntryByDisp"]); + + M42Asset AssetObject = null; + if (AssetId != Guid.Empty) + AssetObject = getAssetsByAsql($"ID = '{AssetId}'").FirstOrDefault(); + + var tbl3 = FragmentRequestBase.SimpleLoad(SPSCommonClassBaseID, "State, State.DisplayString as StateDisp, SUBQUERY(BasicSchemaObjectType AS t, t.Name, t.ID=base.TypeID) as CIName", $"[Expression-ObjectID] = '{ActivityEOID}'"); + if (tbl3?.Rows == null || tbl3.Rows.Count <= 0) + { + LogEntry($"SPSCommonClassBase fragment not found: ClassId={SPSCommonClassBaseID}, ObjectId={ActivityEOID}", LogLevels.Debug); + continue; + } + + var State = getIntFromObject(tbl3.Rows[0]["State"]); + var StateDisp = getStringFromObject(tbl3.Rows[0]["StateDisp"]); + var CIName = getStringFromObject(tbl3.Rows[0]["CIName"]); + + dynamic viewOptionsDyn = new ExpandoObject(); + viewOptionsDyn.objectId = ActivityEOID; + viewOptionsDyn.type = CIName; + viewOptionsDyn.viewType = "action"; + viewOptionsDyn.actionId = TicketCloseActionId; + var viewOptions = WebUtility.UrlEncode(JsonConvert.SerializeObject(viewOptionsDyn)); + + var ticketDirectLinkPreview = string.Format(TicketDirectLinkPreviewTemplate, F4SDM42WebApiController.defaultInstance.BaseUrl, CIName, ActivityEOID); + var ticketDirectLinkEdit = string.Format(TicketDirectLinkEditTemplate, F4SDM42WebApiController.defaultInstance.BaseUrl, CIName, ActivityEOID); + var ticketDirectLinkClose = string.Format(IncidentDirectLinkCloseTemplate, F4SDM42WebApiController.defaultInstance.BaseUrl, ActivityEOID, viewOptions); + + LogEntry($"Activity found: ObjectID={ActivityEOID}, TicketNumber={TicketNumber}, Subject={Subject}, State={State}", LogLevels.Debug); + var ticket = new cF4SDTicket() + { + TicketObjectId = ActivityEOID, + Name = TicketNumber, + CIName = CIName, + StatusId = State, + Status = StateDisp, + Summary = Subject, + AffectedUserId = InitiatorId, + AffectedUser = Initiator, + CreationDate = CreatedDate, + ClosingDate = ClosedDate, + DescriptionHtml = DescriptionHtml, + Description = Description, + SolutionHtml = SolutionHtml, + Solution = Solution, + Priority = Priority, + PriorityId = PriorityId, + CreationSourceId = EntryBy, + CreationSource = EntryByDisp, + CategoryHierarchical = CategoryHierarchical, + CategoryId = CategoryId, + Category = Category, + DirectLinkPreview = ticketDirectLinkPreview, + Urgency = Urgency, + UrgencyId = UrgencyId, + Impact = Impact, + ImpactId = ImpactId + //JournalItems = GetJournalEntriesByEOID(ActivityEOID) + }; + + if (AssetObject != null) + { + ticket.AssetId = AssetId; + ticket.AssetName = Asset; + ticket.AssetDomain = AssetDomain; + ticket.AssetCIId = AssetObject.CIId; + ticket.AssetCIName = AssetObject.CIName; + ticket.AssetSKUAssetGroupId = AssetObject.SKUAssetGroupId; + ticket.AssetSKUAssetGroup = AssetObject.SKUAssetGroup; + ticket.AssetSKUTypeId = AssetObject.SKUTypeId; + ticket.AssetSKUType = AssetObject.SKUType; + } + + if (ticket.StatusId != 204) + ticket.DirectLinkEdit = ticketDirectLinkEdit; + + if ((CIName.ToUpper() == "SPSACTIVITYTYPEINCIDENT" || CIName.ToUpper() == "SPSACTIVITYTYPESERVICEREQUEST") && ticket.StatusId != 204) + ticket.DirectLinkClose = ticketDirectLinkClose; + + tickets.Add(ticket); + } + + tickets = tickets.OrderBy(x => x.CreationDate).ToList(); + tickets.Reverse(); + return tickets; + } + catch (Exception E) + { + LogException(E); + return null; + } + finally + { + LogMethodEnd(CM); + } + } + + internal async Task> GetJournalEntries(Guid activityEOID) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + await Task.Delay(0); + List journalEntries = new List(); + var entries = F4SDM42WebApiController.defaultInstance.GetJournalService().GetJournalList(activityEOID, false, 0, 50, "{2}", 120); + LogEntry($"{entries.Length} Journal entries found for ObjectID={activityEOID}", LogLevels.Debug); + for (int i = 0; i < entries.Length; i++) + { + Matrix42.Contracts.Platform.Data.JournalEntryInfo item = entries[i]; + LogEntry($"Journal entry {i + 1}/{entries.Length}: ID={item.Id}, CreatedDate={item.CreatedDate}, CreatedBy={item.Creator}, Header={item.Header}", LogLevels.Debug); + journalEntries.Add(new cF4SDTicket.cTicketJournalItem() + { + JournalId = item.Id, + ActivityObjectId = activityEOID, + CreatedBy = item.Creator, + CreationDate = (DateTime)item.CreatedDate, + DescriptionHtml = item.Text, + Description = Matrix42.Common.Html.HtmlConverter.ConvertHtmlToPlainText(item.Text), + Header = item.Header, + IsVisibleForUser = item.VisibleInPortal + }); + } + return journalEntries; + } + catch (Exception E) + { + LogException(E); + return null; + } + finally + { + LogMethodEnd(CM); + } + } + + internal async Task updateActivitySolution(Guid objectId, string solutionHtml) + { + + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + await Task.Delay(0); + if (objectId == Guid.Empty) + return false; + + var tbl = FragmentRequestBase.SimpleLoad(SPSActivityClassBaseID, "ID", $"[Expression-ObjectID] = '{objectId}'"); + if (tbl?.Rows == null || tbl.Rows.Count <= 0) + { + LogEntry($"SPSActivityClassBase fragment not found: ClassId={SPSActivityClassBaseID}, ObjectId={objectId}", LogLevels.Debug); + return false; + } + + var fragmentId = getGuidFromObject(tbl.Rows[0]["ID"]); + SPSFragment activityFragment = ObjectBroker.GetFragment(SPSActivityClassBaseID, fragmentId); + activityFragment["SolutionHTML"] = solutionHtml; + ObjectBroker.UpdateFragment(SPSActivityClassBaseID, activityFragment); + return true; + } + catch (Exception E) + { + LogException(E); + return false; + } + finally + { + LogMethodEnd(CM); + } + } + + private List getAssetsByAsql(string Filter) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + // get SPSAssetClassBase + if (string.IsNullOrEmpty(Filter)) + return null; + List assets = new List(); + LogEntry($"ASql Filter: {Filter}"); + var tbl = FragmentRequestBase.SimpleLoad(SPSAssetClassBaseID + , "Id" + + ", COALESCE(T(SPSComputerClassBase).Name, T(SPSAssetClassSIMCard).PhoneNumber, Name) as AssetName" + + ", SUBQUERY(BasicSchemaObjectType AS t, t.Name, t.ID=base.T(SPSCommonClassBase).TypeID) as CIName" + + ", SUBQUERY(BasicSchemaObjectType AS t, t.Id, t.ID=base.T(SPSCommonClassBase).TypeID) as CIId" + + ", SKU.Type as SKUTypeId" + + ", SKU.Type.DisplayString as SKUType" + + ", SKU.Type.AssetGroup as SKUAssetGroupId" + + ", SUBQUERY(SPSAssetPickupTypeCategory AS ag, ag.DisplayString, ag.Value=base.SKU.Type.AssetGroup) as SKUAssetGroup" + + ", T(SPSComputerClassAD).Domain.NT4Name as DomainName" + + ", T(SPSComputerClassAD).Sid as Sid" + , Filter); + if (tbl?.Rows == null || tbl.Rows.Count <= 0) + { + LogEntry($"SPSAssetClassBase fragment not found: ClassId={SPSActivityClassIncidentID}, Filter={Filter}", LogLevels.Debug); + return null; + } + else + { + foreach (DataRow row in tbl.Rows) + { + var asset = new M42Asset() + { + Id = getGuidFromObject(row["Id"]), + Name = getStringFromObject(row["AssetName"]), + CIName = getStringFromObject(row["CIName"]), + CIId = getGuidFromObject(row["CIId"]), + SKUTypeId = getIntFromObject(row["SKUTypeId"]), + SKUType = getStringFromObject(row["SKUType"]), + SKUAssetGroupId = getIntFromObject(row["SKUAssetGroupId"]), + SKUAssetGroup = getStringFromObject(row["SKUAssetGroup"]), + DomainName = getStringFromObject(row["DomainName"]), + Sid = getStringFromObject(row["Sid"]), + }; + assets.Add(asset); + LogEntry($"Asset found: Id={asset.Id}, Name={asset.Name}, CIName={asset.CIName}", LogLevels.Debug); + } + } + return assets; + } + catch (Exception E) + { + LogException(E); + return null; + } + finally + { + LogMethodEnd(CM); + } + } + + private M42Asset getAssetByName(string assetname) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + // get SPSAssetClassBase + if (string.IsNullOrEmpty(assetname)) + return null; + var Filter = string.Format("T(SPSComputerClassBase).Name = '{0}' OR T(SPSAssetClassSIMCard).PhoneNumber = '{0}' OR Name = '{0}'", assetname); + return getAssetsByAsql(Filter)?.First(); + } + catch (Exception E) + { + LogException(E); + return null; + } + finally + { + LogMethodEnd(CM); + } + } + private Guid getUserBySid(string sid) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + string sidPattern = @"^S-\d-\d+-(\d+-){1,14}\d+$"; + if (string.IsNullOrEmpty(sid) || !Regex.IsMatch(sid, sidPattern)) + { + LogEntry($"Invalid or empty SID: '{sid}'", LogLevels.Warning); + return Guid.Empty; + } + + var users = getUsersByAsql(string.Format("Accounts.T(SPSAccountClassAD).Sid = '{0}' OR PrimaryAccount.T(SPSAccountClassAD).Sid = '{0}'", sid)); + return users != null ? users.First().Id : Guid.Empty; + } + catch (Exception E) + { + LogException(E); + return Guid.Empty; + } + finally + { + LogMethodEnd(CM); + } + } + + + private List getUsersByAsql(string asqlFilter) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + var Persons = new List(); + + + LogEntry($"ASql Filter: {asqlFilter}"); + + var tbl = FragmentRequestBase.SimpleLoad(SPSUserClassBaseID, + "Id as Id" + + ", [Expression-ObjectID] as UserEOID" + + ", T(SPSCommonClassBase).State as State" + + ", LastName + ISNULL(', ' + FirstName,'') as Name" + + ", PreferredMailCulture.Locale as Locale" + + ", T(SPSCommonClassBase).State.DisplayString as StateDisp", + asqlFilter); + if (tbl?.Rows == null || tbl.Rows.Count <= 0) + { + LogEntry($"no user entry list found with asql='{asqlFilter}'", LogLevels.Warning); + return null; + } + foreach (DataRow Entry in tbl.Rows) + { + // get the id + var UserId = getGuidFromObject(Entry["ID"]); + if (UserId == Guid.Empty) + { + LogEntry($"no id found for user entry", LogLevels.Warning); + continue; + } + var UserEOID = getGuidFromObject(Entry["UserEOID"]); + if (UserEOID == Guid.Empty) + { + LogEntry($"no expression object id found for user entry", LogLevels.Warning); + continue; + } + var Name = getStringFromObject(Entry["Name"]); + if (string.IsNullOrEmpty(Name)) + { + LogEntry($"no Name found for entry", LogLevels.Debug); + } + var Locale = getStringFromObject(Entry["Locale"]); + if (string.IsNullOrEmpty(Locale)) + { + LogEntry($"no locale found for entry", LogLevels.Debug); + } + var StateDisp = getStringFromObject(Entry["StateDisp"]); + if (string.IsNullOrEmpty(StateDisp)) + { + LogEntry($"no statedisp found for entry", LogLevels.Debug); + } + + + + var State = getIntFromObject(Entry["State"]); + LogEntry($"User found: ID={UserId}, ObjectID={UserEOID}, State={State}", LogLevels.Debug); + if (State != 2023) + LogEntry($"User is not active", LogLevels.Debug); + Persons.Add(new M42User() + { + Id = UserId, + ObjectId = UserEOID, + Name = Name, + State = State, + Locale = Locale, + LanguageId = new CultureInfo(Locale).LCID % 1024, + StateDisp = StateDisp + }); + } + return Persons; + } + catch (Exception E) + { + LogException(E); + return null; + } + finally + { + LogMethodEnd(CM); + } + } + private List getAccountsByAsql(string asqlFilter) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + var result = new List(); + + + LogEntry($"ASql Filter: {asqlFilter}"); + + var tbl = FragmentRequestBase.SimpleLoad(SPSAccountClassBaseID, + "Id as Id" + + ", [Expression-ObjectID] as EOID" + + ", T(SPSCommonClassBase).State as State" + + ", T(SPSAccountClassAD).Sid as Sid" + + ", T(SPSAccountClassAD).UserPrincipalName as UserPrincipalName" + + ", Owner ", + asqlFilter); + if (tbl?.Rows == null || tbl.Rows.Count <= 0) + { + LogEntry($"no account entry list found with asql='{asqlFilter}'", LogLevels.Warning); + return null; + } + foreach (DataRow Entry in tbl.Rows) + { + // get the id + var Id = getGuidFromObject(Entry["ID"]); + if (Id == Guid.Empty) + { + LogEntry($"no id found for entry", LogLevels.Warning); + continue; + } + var EOID = getGuidFromObject(Entry["EOID"]); + if (EOID == Guid.Empty) + { + LogEntry($"no expression object id found for entry", LogLevels.Warning); + continue; + } + var Owner = getGuidFromObject(Entry["Owner"]); + if (Owner == Guid.Empty) + { + LogEntry($"no owner found for entry", LogLevels.Warning); + } + var Sid = getStringFromObject(Entry["Sid"]); + if (string.IsNullOrEmpty(Sid)) + { + LogEntry($"no Sid found for entry", LogLevels.Debug); + } + var UserPrincipalName = getStringFromObject(Entry["UserPrincipalName"]); + if (string.IsNullOrEmpty(UserPrincipalName)) + { + LogEntry($"no UserPrincipalName found for entry", LogLevels.Debug); + } + + + var State = getIntFromObject(Entry["State"]); + LogEntry($"Account found: ID={Id}, ObjectID={EOID}, State={State}", LogLevels.Debug); + result.Add(new M42Account() + { + Id = Id, + EOID = EOID, + State = State, + UserPrincipalName = UserPrincipalName, + Sid = Sid, + Owner = Owner + }); + } + return result; + } + catch (Exception E) + { + LogException(E); + return null; + } + finally + { + LogMethodEnd(CM); + } + } + internal HttpResponseMessage privGetLog(string download, int maxLines, HttpRequestMessage request, string filter) + { + var response = new HttpResponseMessage(); + + + + if (download == "1") + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + try + { + var logger = (DefaultLogger.Manager as cLogManagerFile); + var logFileName = logger.GetLogFileName(); + MemoryStream memoryStream = new MemoryStream(); + + ZipArchive zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Create, leaveOpen: true); + string[] files = Directory.GetFiles(Path.GetDirectoryName(logFileName), $"*.log"); + foreach (string fileName in files) + { + using (var tmpInStream = new FileStream(logFileName, FileMode.Open, + FileAccess.Read, FileShare.ReadWrite)) + { + ZipArchiveEntry zipArchiveEntry = zipArchive.CreateEntry(Path.GetFileName(fileName)); + using (Stream destination = zipArchiveEntry.Open()) + { + tmpInStream.CopyTo(destination); + } + } + } + zipArchive.Dispose(); + memoryStream.Position = 0L; + HttpResponseMessage httpResponseMessage = HttpResponseExtensions.CreateResponse(request, HttpStatusCode.OK); + httpResponseMessage.Content = new StreamContent(memoryStream); + httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") + { + FileName = Path.GetFileNameWithoutExtension(logFileName) + ".zip" + }; + httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); + + return httpResponseMessage; + } + catch (Exception E) + { + LogException(E); + return null; + } + finally + { + LogMethodEnd(CM); + } + + } + else + { + var logger = (DefaultLogger.Manager as cLogManagerFile); + var logFileName = logger.GetLogFileName(); + using (var inStream = new FileStream(logFileName, FileMode.Open, + FileAccess.Read, FileShare.ReadWrite)) + { + var lines = ReadLines(() => inStream, + Encoding.UTF8) + .ToList(); + var sb = new StringBuilder(); + sb.AppendLine(""); + var htmlLines = new List(); + foreach (var line in lines) + { + var lineSplit = line.Split('\t'); + if (string.IsNullOrEmpty(filter) || !string.IsNullOrEmpty(filter) && lineSplit.Length > 4 && filter.ToLowerInvariant().Split(',').Contains(lineSplit[3].ToLowerInvariant())) + htmlLines.Add(""); + } + if (maxLines > 0) + htmlLines = htmlLines.Skip(Math.Max(0, htmlLines.Count() - maxLines)).ToList(); + foreach (var line in htmlLines) + { + sb.AppendLine(line); + } + sb.AppendLine("
" + string.Join("", lineSplit) + "
"); + + response.Content = new StringContent(sb.ToString()); + response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html") + { + CharSet = Encoding.UTF8.HeaderName + }; + response.Content.Headers.Add("CodePage", Encoding.UTF8.CodePage.ToString()); + return response; + } + } + } + + internal List privGetLog2() + { + var response = new HttpResponseMessage(); + { + var logger = (DefaultLogger.Manager as cLogManagerFile); + var logFileName = logger.GetLogFileName(); + using (var inStream = new FileStream(logFileName, FileMode.Open, + FileAccess.Read, FileShare.ReadWrite)) + { + var lines = ReadLines(() => inStream, + Encoding.UTF8) + .ToList(); + + var entries = new List(); + DateTime dateValue; + for (int i = 0; i < lines.Count; i++) + { + string line = lines[i]; + try + { + var lineSplit = line.Split('\t'); + if (lineSplit.Length >= 5) + { + if (string.IsNullOrEmpty(lineSplit[0])) + { + entries.Last().Message += Environment.NewLine + lineSplit[4]; + continue; + } + DateTime.TryParseExact(lineSplit[0], "yyyy-MM-dd HH:mm:ss:fffff", CultureInfo.InvariantCulture, DateTimeStyles.None, out dateValue); + entries.Add(new cM42LogEntry() + { + LineNumber = i + 1, + date = dateValue, + ProcessId = lineSplit[1], + logLvl = lineSplit[3], + Theme = lineSplit[2], + Message = lineSplit[4], + }); + } + } + catch (Exception) + { + + } + } + return entries; + } + } + } + + private int getIntFromObject(object o, int Default = 0) + { + try + { + if (o == null) + return Default; + if (o is DBNull) + return Default; + if (o is int @int) + return @int; + if (o is long int1) + return (int)int1; + if (int.TryParse(o.ToString(), out var r)) + return r; + } + catch { } + return Default; + } + + private DateTime getDateTimeFromObject(object o) + { + try + { + if (o == null) + return DateTime.MinValue; + if (o is DBNull) + return DateTime.MinValue; + if (o is DateTime @dateTime) + return @dateTime; + if (o is string dstr && DateTime.TryParse(o.ToString(), out var r)) + return r; + } + catch { } + return DateTime.MinValue; + } + + private string getStringFromObject(object o, string Default = "") + { + try + { + if (o == null) + return Default; + if (o is DBNull) + return Default; + return o.ToString(); + } + catch { } + return Default; + } + + private Guid getGuidFromObject(object o) + { + try + { + if (o == null) + return Guid.Empty; + if (o is DBNull) + return Guid.Empty; + if (o is Guid G) + return G; + if (Guid.TryParse(o.ToString(), out var r)) + return r; + } + catch { } + return Guid.Empty; + } + + internal cM42LogEntry privGetLog2(int id) + { + return privGetLog2().Find(x => x.LineNumber == id); + } + + internal async Task> getRoleMembershipById(Guid UserId) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + var RoleMemberships = new List(); + try + { + await Task.Delay(0); + var asqlFilter = string.Format("Members.Id = '{0}'", UserId.ToString("D")); + LogEntry($"ASql Filter: {asqlFilter}"); + + FragmentRequestBase fragmentRequestBase = new FragmentRequestBase(SPSSecurityClassRole, ColumnSelectOption.List, "Id as Id" + + ", Name as Name"); + fragmentRequestBase.Where = asqlFilter; + var langExt = new FragmentRequestExtensionLanguage(); + langExt.AddCultureRequest(new CultureInfo("en")); + fragmentRequestBase.AddExtension(langExt); + + using (SPSTransactionScope sPSTransactionScope = new SPSTransactionScope(SPSTransactionScopeOption.Required, new SPSTransactionOptions(IsolationLevel.ReadUncommitted))) + { + fragmentRequestBase.Load(); + sPSTransactionScope.Complete(); + } + + // if requested language is already "en" use the english table + var tbl = fragmentRequestBase.DataSet.Tables[1]; + if (tbl?.Rows == null || tbl.Rows.Count <= 0) + tbl = fragmentRequestBase.DataSet.Tables[0]; + if (tbl?.Rows == null || tbl.Rows.Count <= 0) + { + LogEntry($"no role membership found with asql='{asqlFilter}'", LogLevels.Debug); + return RoleMemberships; + } + foreach (DataRow Entry in tbl.Rows) + { + if (Entry.Table.Columns.Contains("LCID") && (int)Entry["LCID"] != 9) + continue; + // get the id + var IDColumn = Entry.Table.Columns.Contains("Owner") ? "Owner" : "ID"; + var RoleId = getGuidFromObject(Entry[IDColumn]); + if (RoleId == Guid.Empty) + { + LogEntry($"no id found for role entry", LogLevels.Warning); + continue; + } + var Name = getStringFromObject(Entry["Name"]); + if (string.IsNullOrEmpty(Name)) + { + LogEntry($"no Name found for entry", LogLevels.Debug); + } + LogEntry($"Role Membership found: ID={RoleId}, Name={Name}", LogLevels.Debug); + RoleMemberships.Add(new M42Role() { Id = RoleId, Name = Name }); + } + return RoleMemberships; + } + catch (Exception E) + { + LogException(E); + return null; + } + finally + { + LogMethodEnd(CM); + } + } + + /* + internal async Task> getRoleMembershipById(Guid UserId) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + var RoleMemberships = new List(); + try + { + await Task.Delay(0); + var asqlFilter = string.Format("Members.Id = '{0}'", UserId.ToString()); + LogEntry($"ASql Filter: {asqlFilter}"); + var tbl = FragmentRequestBase.SimpleLoad(SPSSecurityClassRole, + "Id as Id" + + ", Name as Name", + asqlFilter); + if (tbl?.Rows == null || tbl.Rows.Count <= 0) + { + LogEntry($"no role membership found with asql='{asqlFilter}'", LogLevels.Debug); + return RoleMemberships; + } + foreach (DataRow Entry in tbl.Rows) + { + // get the id + var RoleId = getGuidFromObject(Entry["ID"]); + if (RoleId == Guid.Empty) + { + LogEntry($"no id found for role entry", LogLevels.Warning); + continue; + } + var Name = getStringFromObject(Entry["Name"]); + if (string.IsNullOrEmpty(Name)) + { + LogEntry($"no Name found for entry", LogLevels.Debug); + } + LogEntry($"Role Membership found: ID={RoleId}, Name={Name}", LogLevels.Debug); + RoleMemberships.Add(new M42Role() { Id = RoleId, Name = Name }); + } + return RoleMemberships; + } + catch (Exception E) + { + LogException(E); + return null; + } + finally + { + LogMethodEnd(CM); + } + } + */ + internal async Task UserPermissionsInfo(string filter) + { + var CM = MethodBase.GetCurrentMethod(); + LogMethodBegin(CM); + var RoleMemberships = new List(); + try + { + await Task.Delay(0); + + var retVal = new UserPermissionsInfo(); + List m42Users = getUsersByAsql(filter); + if (m42Users != null && m42Users.Count == 1) + { + retVal.User = m42Users[0]; + + + retVal.Roles = await getRoleMembershipById(retVal.User.Id); + retVal.User.IsAdmin = retVal.Roles?.Where(i => i.Id == Administrators).FirstOrDefault() != null; + return retVal; + } + return null; + } + catch (Exception E) + { + LogException(E); + return null; + } + finally + { + LogMethodEnd(CM); + } + } + + private enum eM42EntryBy + { + Phone = 0, + Email = 1, + Portal = 2, + CatalogOrder = 3, + EventTrigger = 4, + Feedback = 5, + VisualSupportAgent = 6, + ComplianceAlert = 7, + F4SD = 20010, + } + + public class DirectLink + { + public string Link { get; set; } + public string SubjectParameter { get; set; } + public string DescriptionParameter { get; set; } + } + + public class M42Asset + { + public Guid Id { get; set; } + public string Name { get; set; } + public string CIName { get; set; } + public string SKUType { get; set; } + public string SKUAssetGroup { get; set; } + public Guid CIId { get; set; } + public int SKUTypeId { get; internal set; } + public int SKUAssetGroupId { get; internal set; } + public string DomainName { get; internal set; } + public string Sid { get; internal set; } + } + } + + public class M42User + { + public Guid Id { get; internal set; } + public Guid ObjectId { get; internal set; } + public string Name { get; internal set; } + public string FirstName { get; internal set; } + public string LastName { get; internal set; } + public string Email { get; internal set; } + public string Photo { get; internal set; } + public string Phone { get; internal set; } + public string Currency { get; internal set; } + public string Locale { get; internal set; } + public int LanguageId { get; internal set; } + public bool IsAdmin { get; internal set; } + public int State { get; internal set; } + public string StateDisp { get; internal set; } + } + + internal class M42Account + { + public Guid Id { get; internal set; } + public Guid EOID { get; internal set; } + public Guid Owner { get; internal set; } + public int State { get; internal set; } + public string UserPrincipalName { get; internal set; } + public string Sid { get; internal set; } + } + + public class M42Role + { + public Guid Id { get; internal set; } + public string Name { get; internal set; } + + } + + public class UserPermissionsInfo + { + public M42User User { get; internal set; } + public List Roles { get; internal set; } + public UserPermissionsInfo() + { + User = new M42User(); + Roles = new List(); + } + } + + internal sealed class UrlQueryBuilder + { + private readonly List> _values = new List>(); + + private UrlQueryBuilder() + { + } + + public static UrlQueryBuilder Parse(string query) + { + var builder = new UrlQueryBuilder(); + var normalizedQuery = (query ?? string.Empty).TrimStart('?'); + + foreach (var pair in normalizedQuery.Split(new[] { '&' }, StringSplitOptions.RemoveEmptyEntries)) + { + var separatorIndex = pair.IndexOf('='); + var key = separatorIndex >= 0 ? pair.Substring(0, separatorIndex) : pair; + var value = separatorIndex >= 0 ? pair.Substring(separatorIndex + 1) : string.Empty; + + builder.Add(WebUtility.UrlDecode(key), WebUtility.UrlDecode(value)); + } + + return builder; + } + + public void Add(string key, string value) + { + if (!string.IsNullOrEmpty(key)) + _values.Add(new KeyValuePair(key, value ?? string.Empty)); + } + + public override string ToString() + { + return string.Join("&", _values.Select(pair => $"{WebUtility.UrlEncode(pair.Key)}={WebUtility.UrlEncode(pair.Value)}")); + } + } +} diff --git a/F4SDM42WebApi/F4SDM42WebApiController.cs b/F4SDM42WebApi/F4SDM42WebApiController.cs index b231c22..f810c49 100644 --- a/F4SDM42WebApi/F4SDM42WebApiController.cs +++ b/F4SDM42WebApi/F4SDM42WebApiController.cs @@ -1,25 +1,28 @@ -using C4IT.F4SDM; -using C4IT.FASD.Base; -using C4IT.Logging; -using Matrix42.Common; -using Matrix42.Contracts.ServiceManagement.ServiceContracts; -using Matrix42.Pandora.Contracts; -using Matrix42.Services.Description.Contracts; -using System; +using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Net; using System.Net.Http; using System.Reflection; +using System.Threading; using System.Threading.Tasks; -using System.Web; -using System.Web.Http; -using System.Web.Http.Controllers; -using System.Web.OData; -using System.Web.OData.Query; + +using Matrix42.Common; +using Matrix42.Contracts.Common.Security; +using Matrix42.Contracts.ServiceManagement.ServiceContracts; +using Matrix42.Hosting.Contracts; +using Matrix42.Pandora.Contracts; +using Matrix42.Persistence.Contracts; +using Matrix42.Services.Description.Contracts; +using Matrix42.WebApi.Contracts; +using Matrix42.WebApi.Contracts.OData; using update4u.SPS.Utility.GlobalConfiguration; -using static C4IT.FASD.Base.cF4SDTicket; + +using C4IT.F4SDM; +using C4IT.FASD.Base; +using C4IT.Logging; + using static C4IT.Logging.cLogManager; namespace C4IT.F4SD @@ -28,47 +31,33 @@ namespace C4IT.F4SD public partial class F4SDM42WebApiController : ApiController { public static bool IsInitialized { get; private set; } = false; + public static F4SDM42WebApiController defaultInstance; //private readonly IIncidentService _incidentService; internal readonly GlobalConfigurationProvider _globalConfigurationProvider; - public readonly IJournalService _journalService; //public readonly IObjectService _objectService; //public readonly IFragmentService _fragmentService; - internal readonly IEntityDataService _entityDataService; - internal readonly IPandoraUserProfile _userProfile; + private readonly IDependencyResolver _resolver; private readonly F4SDHelperService _f4stHelperService; - public string BaseUrl => $"{Request.RequestUri.Scheme}://{Request.RequestUri.Host}"; + public string BaseUrl => Request?.RequestUri == null ? string.Empty : $"{Request.RequestUri.Scheme}://{Request.RequestUri.Host}"; public string EndpointBaseUrl => $"{BaseUrl}/m42Services/api/c4itf4sdwebapi"; - public F4SDM42WebApiController( - //IObjectService objectService, - //IIncidentService incidentService, - IJournalService journalService - //IFragmentService fragmentService, - , IEntityDataService entityDataService - , IPandoraUserProfile userProfile - ) - { - defaultInstance = this; - //_objectService = objectService; - //_fragmentService = fragmentService; - //_incidentService = Guard.NullArgument(incidentService, "incidentService"); - _entityDataService = entityDataService; - _journalService = journalService; + public F4SDM42WebApiController(IDependencyResolver resolver) + { + _resolver = resolver ?? throw new ArgumentNullException(nameof(resolver)); + defaultInstance = this; _globalConfigurationProvider = GlobalConfigurationProvider.Instance; _f4stHelperService = new F4SDHelperService(); - _userProfile = userProfile; + EnsureInitialized(); } - private static object initLock = new object(); - protected override void Initialize(HttpControllerContext controllerContext) + private static readonly object initLock = new object(); + private static void EnsureInitialized() { - base.Initialize(controllerContext); try { - //System.Diagnostics.Debugger.Launch(); lock (initLock) { if (IsInitialized || F4SDM42LogsWebApiController.IsInitialized) @@ -85,40 +74,80 @@ namespace C4IT.F4SD catch { }; } + internal IJournalService GetJournalService() + { + return GetRequiredService(); + } + + private IEnumerationProvider GetEnumerationProvider() + { + return GetRequiredService(); + } + + private T GetRequiredService() where T : class + { + var service = _resolver.TryGet(); + if (service != null) + return service; + + throw new InvalidOperationException($"Required Matrix42 service is not registered: {typeof(T).FullName}"); + } + [Route("getDirectLinkCreateTicket"), HttpGet] public async Task getDirectLinkCreateTicket(string sid = "", string assetname = "") { await Task.Delay(0); return await _f4stHelperService.getDirectLinkCreateTicket(sid, assetname); } + [Route("getDirectLinkF4SD"), HttpGet] public async Task getDirectLinkF4SD(Guid EOID, string Type) { return await _f4stHelperService.getDirectLinkF4SD(EOID, Type); } + [Obsolete] [Route("getTicketList"), HttpGet] - public async Task> getTicketList( - string sid, - int hours, - int queueoption = 0, - string queues = "" - ) - { - var decodedPairs = ParseQueues(queues); - - // Nun weiterreichen an Service - return await _f4stHelperService.getTicketListByUser( - sid, - hours, - queueoption, + public async Task> getTicketList( + string sid, + int hours, + int queueoption = 0, + string queues = "" + ) + { + var decodedPairs = ParseQueues(queues); + + // Nun weiterreichen an Service + return await _f4stHelperService.getTicketListByUser( + sid, + hours, + queueoption, + decodedPairs + ); + } + + [Route("getTicketListForUser"), HttpGet] + public async Task> getTicketListForUser( + Guid userId, + int hours, + int queueoption = 0, + string queues = "" + ) + { + var decodedPairs = ParseQueues(queues); + + // Nun weiterreichen an Service + return await _f4stHelperService.getTicketListByUser( + userId, + hours, + queueoption, decodedPairs ); } [Route("getTicketDetails"), HttpGet] - public async Task getTicketDetails(Guid objectId) + public async Task getTicketDetails(Guid objectId) { var tickets = await _f4stHelperService.getTicketDetails(new List() { objectId }); if (tickets.Count > 0) @@ -127,73 +156,136 @@ namespace C4IT.F4SD return null; } - [Route("getTicketHistory"), HttpGet] - public async Task> getTicketHistory(Guid objectId) - { - return await _f4stHelperService.GetJournalEntries(objectId); - } - - [Route("getTicketOverviewCounts"), HttpGet] - public async Task getTicketOverviewCounts( - string sid, - string scope = "personal", - string keys = "", - int queueoption = 0, - string queues = "" - ) - { - var parsedKeys = (keys ?? string.Empty) - .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) - .Select(key => key.Trim()) - .Where(key => !string.IsNullOrWhiteSpace(key)) - .ToList(); - - var decodedQueues = ParseQueues(queues); - return await _f4stHelperService.getTicketOverviewCounts(sid, scope, parsedKeys, queueoption, decodedQueues); - } - - [Route("getTicketOverviewCountsByRoles"), HttpPost] - public async Task getTicketOverviewCountsByRoles([FromBody] TicketOverviewCountsByRolesRequest request) - { - var parsedKeys = (request?.Keys ?? new List()) - .Where(key => !string.IsNullOrWhiteSpace(key)) - .Select(key => key.Trim()) - .Distinct(StringComparer.OrdinalIgnoreCase) - .ToList(); - - var roleGuids = (request?.RoleGuids ?? new List()) - .Where(roleId => roleId != Guid.Empty) - .Distinct() - .ToList(); - - var decodedQueues = ParseQueues(request?.Queues ?? string.Empty); - return await _f4stHelperService.getTicketOverviewCountsByRoles( - request?.Sid, - roleGuids, - parsedKeys, - request?.QueueOption ?? 0, - decodedQueues - ); - } - - [Route("getTicketOverviewRelations"), HttpGet] - public async Task> getTicketOverviewRelations( - string sid, - string scope = "personal", - string key = "", - int count = 0, - int queueoption = 0, - string queues = "" - ) - { - var decodedQueues = ParseQueues(queues); - return await _f4stHelperService.getTicketOverviewRelations(sid, scope, key, count, queueoption, decodedQueues); - } - /* - [Route("updateActivitySolution/{objectId}"), HttpPost] - public async Task updateActivitySolution(Guid objectId, [FromBody] string SolutionHtml) - { - return new HttpResponseMessage + [Route("getTicketHistory"), HttpGet] + public async Task> getTicketHistory(Guid objectId) + { + return await _f4stHelperService.GetJournalEntries(objectId); + } + + [Obsolete] + [Route("getTicketOverviewCounts"), HttpGet] + public async Task getTicketOverviewCounts( + string sid, + string scope = "personal", + string keys = "", + int queueoption = 0, + string queues = "" + ) + { + var parsedKeys = (keys ?? string.Empty) + .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) + .Select(key => key.Trim()) + .Where(key => !string.IsNullOrWhiteSpace(key)) + .ToList(); + + var decodedQueues = ParseQueues(queues); + return await _f4stHelperService.getTicketOverviewCounts(sid, scope, parsedKeys, queueoption, decodedQueues); + } + + + [Route("getTicketOverviewCountsForUser"), HttpGet] + public async Task getTicketOverviewCountsForUser( + Guid userId, + string scope = "personal", + string keys = "", + int queueoption = 0, + string queues = "" + ) + { + var parsedKeys = (keys ?? string.Empty) + .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) + .Select(key => key.Trim()) + .Where(key => !string.IsNullOrWhiteSpace(key)) + .ToList(); + + var decodedQueues = ParseQueues(queues); + return await _f4stHelperService.getTicketOverviewCounts(userId, scope, parsedKeys, queueoption, decodedQueues); + } + + [Obsolete] + [Route("getTicketOverviewCountsByRoles"), HttpPost] + public async Task getTicketOverviewCountsByRoles([FromBody] TicketOverviewCountsByRolesRequest request) + { + var parsedKeys = (request?.Keys ?? new List()) + .Where(key => !string.IsNullOrWhiteSpace(key)) + .Select(key => key.Trim()) + .Distinct(StringComparer.OrdinalIgnoreCase) + .ToList(); + + var roleGuids = (request?.RoleGuids ?? new List()) + .Where(roleId => roleId != Guid.Empty) + .Distinct() + .ToList(); + + var decodedQueues = ParseQueues(request?.Queues ?? string.Empty); + return await _f4stHelperService.getTicketOverviewCountsByRoles( + request?.Sid, + roleGuids, + parsedKeys, + request?.QueueOption ?? 0, + decodedQueues + ); + } + + [Route("getTicketOverviewCountsByRolesForUser"), HttpPost] + public async Task getTicketOverviewCountsByRolesForUser([FromBody] TicketOverviewCountsByRolesForUserRequest request) + { + var parsedKeys = (request?.Keys ?? new List()) + .Where(key => !string.IsNullOrWhiteSpace(key)) + .Select(key => key.Trim()) + .Distinct(StringComparer.OrdinalIgnoreCase) + .ToList(); + + var roleGuids = (request?.RoleGuids ?? new List()) + .Where(roleId => roleId != Guid.Empty) + .Distinct() + .ToList(); + + var decodedQueues = ParseQueues(request?.Queues ?? string.Empty); + return await _f4stHelperService.getTicketOverviewCountsByRoles( + request.userId, + roleGuids, + parsedKeys, + request?.QueueOption ?? 0, + decodedQueues + ); + } + + [Obsolete] + [Route("getTicketOverviewRelations"), HttpGet] + public async Task> getTicketOverviewRelations( + string sid, + string scope = "personal", + string key = "", + int count = 0, + int queueoption = 0, + string queues = "" + ) + { + var decodedQueues = ParseQueues(queues); + return await _f4stHelperService.getTicketOverviewRelations(sid, scope, key, count, queueoption, decodedQueues); + } + + [Route("getTicketOverviewRelationsForUser"), HttpGet] + public async Task> getTicketOverviewRelations( + Guid userId, + string scope = "personal", + string key = "", + int count = 0, + int queueoption = 0, + string queues = "" + ) + { + var decodedQueues = ParseQueues(queues); + return await _f4stHelperService.getTicketOverviewRelations(userId, scope, key, count, queueoption, decodedQueues); + } + + + /* + [Route("updateActivitySolution/{objectId}"), HttpPost] + public async Task updateActivitySolution(Guid objectId, [FromBody] string SolutionHtml) + { + return new HttpResponseMessage { StatusCode = await _f4stHelperService.updateActivitySolution(objectId, SolutionHtml) ? HttpStatusCode.NoContent : HttpStatusCode.BadRequest, }; @@ -201,10 +293,14 @@ namespace C4IT.F4SD */ [Route("getPickup/{name}"), HttpGet] //[CacheOutput(UseETAG = true)] - public async Task getPickup(string name, [FromUri] EntityEnumerationVisibilityMode mode = EntityEnumerationVisibilityMode.None, [FromUri] Int32 group = -1) + public async Task getPickup(string name, [FromUri] EntityEnumerationVisibilityMode mode = EntityEnumerationVisibilityMode.None, [FromUri] Int32 group = -1) { await Task.Delay(0); - EntityEnumeration enumerationTemp = _entityDataService.GetEnumeration(name, mode); + var pickupName = ResolvePickupName(name); + if (string.IsNullOrWhiteSpace(pickupName)) + throw new ArgumentException("Pickup name is required.", nameof(name)); + + EntityEnumeration enumerationTemp = GetEnumeration(pickupName, mode); var vals = enumerationTemp.Values; if (group > -1) @@ -224,19 +320,22 @@ namespace C4IT.F4SD Values = vals.ToArray() }; //CacheOutputAttribute.RegisterResponseEtag($"enum_{enumeration.Name}_{(int)mode}", $"{enumeration.Name}_{(int)mode}", cultureInvariant: false, userInvariant: true, val); - return Request.CreateResponse(HttpStatusCode.OK, enumeration); + return enumeration; } - [Route("getMyRoleMemberships", Order = 2), HttpGet] - public async Task getMyRoleMemberships() + [Route("getMyRoleMemberships"), HttpGet] + public async Task getMyRoleMemberships() { - var User = _userProfile.GetInteractiveUserInfo(); - var filter = AsqlHelper.BuildInCondition("ID", new Guid[] { User.Id }); - return Request.CreateResponse(HttpStatusCode.OK, await _f4stHelperService.UserPermissionsInfo(filter)); + var userId = GetCurrentUserId(); + if (userId == Guid.Empty) + throw new UnauthorizedAccessException("Cannot determine the interactive Matrix42 user."); + + var filter = AsqlHelper.BuildInCondition("ID", new Guid[] { userId }); + return await _f4stHelperService.UserPermissionsInfo(filter); } - [HttpGet] - [Route("getRoleMemberships", Order = 1)] - public async Task getRoleMemberships([FromUri] GetRoleMembershipsRequest req) + + [Route("getRoleMemberships"), HttpGet] + public async Task getRoleMemberships([FromUri] GetRoleMembershipsRequest req) { var filter = ""; @@ -255,7 +354,7 @@ namespace C4IT.F4SD if (!string.IsNullOrEmpty(filter)) { - return Request.CreateResponse(HttpStatusCode.OK, await _f4stHelperService.UserPermissionsInfo(filter)); + return await _f4stHelperService.UserPermissionsInfo(filter); } else { @@ -263,48 +362,190 @@ namespace C4IT.F4SD } } - public class GetRoleMembershipsRequest - { - public Guid? Id { get; set; } - public string Sid { get; set; } - public string Upn { get; set; } - public GetRoleMembershipsRequest() { } - } - - public class TicketOverviewCountsByRolesRequest - { - public string Sid { get; set; } - public List RoleGuids { get; set; } = new List(); - public List Keys { get; set; } = new List(); - public int? QueueOption { get; set; } - public string Queues { get; set; } - } - - private static List ParseQueues(string queues) - { - return (queues ?? string.Empty) - .Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries) - .Select(part => - { - var segments = part.Split(':'); - if (segments.Length != 2) - return null; - - var name = HttpUtility.UrlDecode(segments[0]); - var idStr = HttpUtility.UrlDecode(segments[1]); - - return Guid.TryParse(idStr, out var guid) - ? new cApiM42TicketQueueInfo { QueueName = name, QueueID = guid } - : null; - }) - .Where(q => q != null) - .ToList(); - } + [Route("getRoleMemberships/{userId}"), HttpGet] + public async Task getRoleMembershipForUser(Guid userId) + { + var filter = AsqlHelper.BuildInCondition("ID", new Guid[] { userId }); + return await _f4stHelperService.UserPermissionsInfo(filter); + } + + [Obsolete] + public class GetRoleMembershipsRequest + { + public Guid? Id { get; set; } + public string Sid { get; set; } + public string Upn { get; set; } + public GetRoleMembershipsRequest() { } + } + + [Obsolete] + public class TicketOverviewCountsByRolesRequest + { + public string Sid { get; set; } + public List RoleGuids { get; set; } = new List(); + public List Keys { get; set; } = new List(); + public int? QueueOption { get; set; } + public string Queues { get; set; } + } + + public class TicketOverviewCountsByRolesForUserRequest + { + public Guid userId { get; set; } + public List RoleGuids { get; set; } = new List(); + public List Keys { get; set; } = new List(); + public int? QueueOption { get; set; } + public string Queues { get; set; } + } + + private EntityEnumeration GetEnumeration(string name, EntityEnumerationVisibilityMode mode) + { + name = name?.Trim(); + var dataTable = GetEnumerationProvider().GetEnumeration(name, GetVisibilityFilter(mode)); + if (dataTable == null) + throw new InvalidOperationException($"Enumeration '{name}' was not found."); + + var valueColumn = FindColumn(dataTable, "Value") ?? FindNumericColumn(dataTable); + if (string.IsNullOrEmpty(valueColumn)) + throw new InvalidOperationException($"Enumeration '{name}' does not contain a numeric value column."); + + var displayColumn = FindColumn(dataTable, "DisplayString") + ?? FindColumn(dataTable, "DisplayExpression") + ?? FindColumn(dataTable, "Name") + ?? valueColumn; + var hiddenColumn = FindColumn(dataTable, "Hidden"); + + var values = dataTable.Rows.Cast() + .Select(row => new EntityEnumerationValue + { + Value = ConvertHelper.ParseInt(row[valueColumn], 0), + DisplayString = Convert.ToString(row[displayColumn]), + Hidden = hiddenColumn != null && ConvertHelper.ParseInt(row[hiddenColumn], 0) == 1, + Extentions = dataTable.Columns.Cast() + .ToDictionary(column => column.ColumnName, column => row[column]) + }) + .ToArray(); + + return new EntityEnumeration + { + Name = name, + Values = values + }; + } + + private string ResolvePickupName(string routeName) + { + if (!string.IsNullOrWhiteSpace(routeName)) + return routeName.Trim(); + + var pathSegment = Request?.RequestUri?.Segments? + .LastOrDefault(segment => !string.IsNullOrWhiteSpace(segment) && segment != "/"); + + if (string.IsNullOrWhiteSpace(pathSegment)) + return null; + + return Uri.UnescapeDataString(pathSegment.Trim('/')); + } + + private static bool? GetVisibilityFilter(EntityEnumerationVisibilityMode mode) + { + switch (mode) + { + case EntityEnumerationVisibilityMode.Visible: + return true; + case EntityEnumerationVisibilityMode.Hidden: + return false; + default: + return null; + } + } + + private static string FindColumn(DataTable dataTable, string columnName) + { + return dataTable.Columns.Cast() + .FirstOrDefault(column => string.Equals(column.ColumnName, columnName, StringComparison.OrdinalIgnoreCase)) + ?.ColumnName; + } + + private static string FindNumericColumn(DataTable dataTable) + { + var excludedNames = new HashSet(StringComparer.OrdinalIgnoreCase) + { + "Hidden", + "Position", + "StateGroup" + }; + + return dataTable.Columns.Cast() + .FirstOrDefault(column => !excludedNames.Contains(column.ColumnName) && IsNumericType(column.DataType)) + ?.ColumnName; + } + + private static bool IsNumericType(Type type) + { + return type == typeof(byte) + || type == typeof(short) + || type == typeof(int) + || type == typeof(long) + || type == typeof(sbyte) + || type == typeof(ushort) + || type == typeof(uint) + || type == typeof(ulong); + } + + private static Guid GetCurrentUserId() + { + var principal = Thread.CurrentPrincipal as IM42Principal; + return principal?.InteractivePrincipal?.M42Identity?.UserFragmentID + ?? principal?.M42Identity?.UserFragmentID + ?? Guid.Empty; + } + + private static List ParseQueues(string queues) + { + return (queues ?? string.Empty) + .Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries) + .Select(part => + { + var decodedPart = WebUtility.UrlDecode(part)?.Trim(); + if (string.IsNullOrWhiteSpace(decodedPart)) + return null; + + var name = decodedPart; + string idStr = null; + + var separatorIndex = decodedPart.IndexOf(':'); + if (separatorIndex >= 0) + { + name = decodedPart.Substring(0, separatorIndex).Trim(); + idStr = decodedPart.Substring(separatorIndex + 1).Trim(); + } + + var queue = new cApiM42TicketQueueInfo(); + if (!string.IsNullOrWhiteSpace(name)) + queue.QueueName = name; + + if (!string.IsNullOrWhiteSpace(idStr)) + { + if (!Guid.TryParse(idStr, out var guid)) + return null; + + queue.QueueID = guid; + queue.QueueName = null; + } + + if (queue.QueueID == Guid.Empty && string.IsNullOrWhiteSpace(queue.QueueName)) + return null; + + return queue; + }) + .Where(q => q != null) + .ToList(); + } [Route("isAlive"), HttpGet] - public HttpResponseMessage isAlive() + public IHttpActionResult isAlive() { - return new HttpResponseMessage(HttpStatusCode.NoContent); + return new StatusCodeResult(HttpStatusCode.NoContent); } [Route("loglevel"), HttpGet] @@ -343,6 +584,7 @@ namespace C4IT.F4SD } } } + [RoutePrefix("api/C4ITF4SDWebApi/Logs")] public partial class F4SDM42LogsWebApiController : ApiController { @@ -350,10 +592,9 @@ namespace C4IT.F4SD public static bool IsInitialized { get; private set; } = false; - private static object initLock = new object(); - protected override void Initialize(HttpControllerContext controllerContext) + private static readonly object initLock = new object(); + private static void EnsureInitialized() { - base.Initialize(controllerContext); try { lock (initLock) @@ -372,25 +613,18 @@ namespace C4IT.F4SD catch { }; } - - public F4SDM42LogsWebApiController() { _f4stHelperService = new F4SDHelperService(); + EnsureInitialized(); } [Route(""), HttpGet] - [EnableQuery] public IEnumerable getLog2(ODataQueryOptions queryOptions) { try { - IQueryable queryable = _f4stHelperService.privGetLog2().AsQueryable(); - if (queryOptions.Filter != null) - { - queryable = queryOptions.Filter.ApplyTo(queryable, new ODataQuerySettings()).Cast(); - } - return queryable; + return ApplyLogFilter(_f4stHelperService.privGetLog2(), queryOptions); } catch (Exception E) { @@ -403,12 +637,7 @@ namespace C4IT.F4SD [HttpGet] public int Log2Count(ODataQueryOptions queryOptions) { - IQueryable queryable = _f4stHelperService.privGetLog2().AsQueryable(); - if (queryOptions.Filter != null) - { - queryable = queryOptions.Filter.ApplyTo(queryable, new ODataQuerySettings()).Cast(); - } - return queryable.Count(); + return ApplyLogFilter(_f4stHelperService.privGetLog2(), queryOptions).Count(); } [Route("{id}")] @@ -417,6 +646,28 @@ namespace C4IT.F4SD { return _f4stHelperService.privGetLog2(id); } + + private static IEnumerable ApplyLogFilter(IEnumerable entries, ODataQueryOptions queryOptions) + { + var result = entries ?? Enumerable.Empty(); + var filter = queryOptions?.Filter; + + if (!string.IsNullOrWhiteSpace(filter)) + { + result = result.Where(entry => + (entry.Message?.IndexOf(filter, StringComparison.OrdinalIgnoreCase) ?? -1) >= 0 || + (entry.logLvl?.IndexOf(filter, StringComparison.OrdinalIgnoreCase) ?? -1) >= 0 || + (entry.Theme?.IndexOf(filter, StringComparison.OrdinalIgnoreCase) ?? -1) >= 0); + } + + if (queryOptions?.Skip != null) + result = result.Skip(queryOptions.Skip.Value); + + if (queryOptions?.Top != null) + result = result.Take(queryOptions.Top.Value); + + return result; + } } public class cGetPropertyBody diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/.gitignore b/F4SDM42WebApi/M42ExtensionScaffolder/.gitignore new file mode 100644 index 0000000..5d9146d --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/.gitignore @@ -0,0 +1,28 @@ + +.idea/ +.vs/ +.vscode/ +node_modules/ +dist/ + +package-lock.json +workspace.json + +.vs/ +.libs/ +.build/ + +bin/ +obj/ + +*.user + +/**/AssemblyInfoProduct.cs +/**/_Resharper.Caches +/Solutions/*.sln.DotSettings.user +/Solutions/**/*.csproj.user +/Solutions/**/packages/*.* +/Solutions/**/**/AssemblyInfoProduct.cs +/Solutions/TestResult/*.* + +BasePackage/Assemblies/ diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/README.md b/F4SDM42WebApi/M42ExtensionScaffolder/README.md new file mode 100644 index 0000000..8ad5920 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/README.md @@ -0,0 +1,14 @@ +# M42ExtensionScaffolder + +## Description +Template project acting as an extension scaffolder. Automatically generate extension structure including provided projects and runtimes + +## Owner +Name: Titan +Email: dmytro.romanii@matrix42.com + +## Product +M42 Enterprise + +## Documentation +- [Service Information](./service-info.yml) diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Console/Matrix42.Extensions.Scaffolder.Console.csproj b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Console/Matrix42.Extensions.Scaffolder.Console.csproj new file mode 100644 index 0000000..120ad47 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Console/Matrix42.Extensions.Scaffolder.Console.csproj @@ -0,0 +1,25 @@ + + + + Exe + net8.0 + enable + enable + + + + + + + + + + + + + + PreserveNewest + + + + diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Console/Program.cs b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Console/Program.cs new file mode 100644 index 0000000..e2b0d7d --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Console/Program.cs @@ -0,0 +1,61 @@ +using Matrix42.Extensions.Scaffolder.Core; +using Matrix42.Extensions.Scaffolder.Core.Project; +using Microsoft.Extensions.Configuration; + +namespace Matrix42.Extensions.Scaffolder.ConsoleApp +{ + internal class Program + { + static void Main(string[] args) + { + var config = new ConfigurationBuilder() + .SetBasePath(Directory.GetCurrentDirectory()) // required for appsettings.json + .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) + .Build(); + + var extensionPath = config["Scaffolder:ExtensionPath"]; + var extensionIdStr = config["Scaffolder:ExtensionId"]; + var extensionNamespace = config["Scaffolder:ExtensionNamespace"]; + + if (string.IsNullOrWhiteSpace(extensionPath)) + throw new Exception("Scaffolder:ExtensionPath is missing in appsettings.json"); + + var extensionId = Guid.TryParse(extensionIdStr, out var gid) ? gid : Guid.NewGuid(); + + var options = new ExtensionScaffoldingOptions + { + ExtensionPath = extensionPath, + ExtensionId = extensionId, + ExtensionNamespace = extensionNamespace, + Projects = [ + new ProjectDefinition + { + Prefix = "Services", + Runtimes = RuntimeTargets.WinCore | RuntimeTargets.LinuxCore, + Functionality = ProjectFunctionality.WebApi + }, + + new ProjectDefinition + { + Prefix = "Contracts", + Runtimes = RuntimeTargets.All, + Functionality = ProjectFunctionality.Custom + }, + new ProjectDefinition + { + Prefix = "BizLogic", + Runtimes = RuntimeTargets.All, + Functionality = ProjectFunctionality.Custom + } + ] + }; + + var scaffolder = new ExtensionScaffolder(); + var projects = scaffolder.Generate(options); + + Console.WriteLine("Generated projects:"); + foreach (var p in projects) + Console.WriteLine(" - " + p); + } + } +} diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Console/appsettings.json b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Console/appsettings.json new file mode 100644 index 0000000..1ffe77c --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Console/appsettings.json @@ -0,0 +1,7 @@ +{ + "Scaffolder": { + "ExtensionPath": "C:\\Projects\\Matrix42\\Titan_Linux\\ESM-FieldServiceManagement-Extension_demo", + "ExtensionId": "c55407f9-9b46-4483-8b65-1bc1c3827efc", + "ExtensionNamespace": "Matrix42.FieldServiceManagement" + } +} \ No newline at end of file diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Extension.Assemblies.targets b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Extension.Assemblies.targets new file mode 100644 index 0000000..afb3853 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Extension.Assemblies.targets @@ -0,0 +1,206 @@ + + + + + + $(MSBuildThisFileDirectory)BasePackage\Assemblies\ + + + $(MSBuildThisFileDirectory)..\Root\InstalledPackages\Assemblies\$(M42ExtensionId)\ + + + $(MSBuildProjectName)*.* + win-x64;linux-x64 + + + true + + + + + + + + <_M42RidList Include="$(M42DefaultRids)" /> + + + + + + true + + + + + + + + + + + <_M42FlatRootRidless Include="$(TargetDir)$(M42AssemblyPattern)" /> + + + + + + + + + + + + + + + + + + + + + + + + + $([System.IO.Path]::GetFullPath('$(TargetDir)..\')) + + + + + + + <_M42FlatRoot Include="$(M42_RidlessTargetDir)$(M42AssemblyPattern)" /> + + + + + + + + + + + + + + + + + + + + <_M42Rid Include="$(TargetDir)**\$(M42AssemblyPattern)" /> + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/ExtensionScaffolder.cs b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/ExtensionScaffolder.cs new file mode 100644 index 0000000..7c88cfa --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/ExtensionScaffolder.cs @@ -0,0 +1,232 @@ +using Matrix42.Extensions.Scaffolder.Core.ProjectGenerators; +using System; +using System.Collections.Generic; +using System.IO; + +namespace Matrix42.Extensions.Scaffolder.Core; + +public sealed class ExtensionScaffolder : IExtensionScaffolder +{ + private readonly DefaultProjectGenerator _projectGenerator = new(); + + public IReadOnlyList Generate(ExtensionScaffoldingOptions options) + { + if (options is null) + throw new ArgumentNullException(nameof(options)); + + + if (string.IsNullOrWhiteSpace(options.ExtensionPath)) throw new ArgumentException("ExtensionPath must be set.", nameof(options)); + + if (string.IsNullOrWhiteSpace(options.ExtensionNamespace)) throw new ArgumentException("ExtensionNamespace must be set.", nameof(options)); + + if (options.Projects == null) throw new ArgumentException("Projects must be set.", nameof(options)); + + var result = new List(); + + PrepareRootStructure(options); + PrepareBasePackage(options); + var solutionDir = PrepareSolutionFolder(options); + PrepareRootArtifacts(options); + PrepareSolutionFiles(options, solutionDir); + + foreach (var def in options.Projects) + { + var csprojPath = _projectGenerator.GenerateProject(options, def); + result.Add(csprojPath); + } + + GenerateSolutionFile(options, solutionDir, result); + + return result; + } + + private void PrepareRootStructure(ExtensionScaffoldingOptions options) + { + Directory.CreateDirectory(options.ExtensionPath); + } + + private void PrepareBasePackage(ExtensionScaffoldingOptions options) + { + var basePackageDir = Path.Combine(options.ExtensionPath, "BasePackage"); + Directory.CreateDirectory(basePackageDir); + + var packageJsonPath = Path.Combine(basePackageDir, "package.json"); + if (!File.Exists(packageJsonPath)) + { + var json = GetDefaultPackageJson(options); + File.WriteAllText(packageJsonPath, json); + } + } + + /// + /// Creates /Solutions/{ns} and returns that path (solution-level folder). + /// + private string PrepareSolutionFolder(ExtensionScaffoldingOptions options) + { + var solutionDir = Path.Combine(options.ExtensionPath, "Solutions", options.ExtensionNamespace); + Directory.CreateDirectory(solutionDir); + return solutionDir; + } + + private void PrepareRootArtifacts(ExtensionScaffoldingOptions options) + { + /*var azurePath = Path.Combine(options.ExtensionPath, "azure-pipelines-ci.yml"); + if (!File.Exists(azurePath)) + { + File.WriteAllText(azurePath, Templates.AzurePipelinesYml); + }*/ + + var azurePath = Path.Combine(options.ExtensionPath, "azure-pipelines-ci.yaml"); + if (!File.Exists(azurePath)) + { + var repoName = new DirectoryInfo(options.ExtensionPath).Name; + + var content = Templates.GetAzurePiplineCi(); + var replacedContent = content.Replace("{repoName}", repoName).Replace("{ns}", options.ExtensionNamespace); + File.WriteAllText(azurePath, replacedContent); + } + + var gitignorePath = Path.Combine(options.ExtensionPath, ".gitignore"); + if (!File.Exists(gitignorePath)) + { + File.WriteAllText(gitignorePath, Templates.Gitignore); + } + + /*var veracodePath = Path.Combine(options.ExtensionPath, "PrepareVeracodeScan.cmd"); + if (!File.Exists(veracodePath)) + { + var content = Templates.PrepareVeracodeScanCmd.Replace("{ns}", options.ExtensionNamespace); + File.WriteAllText(veracodePath, content); + }*/ + + var targetsPath = Path.Combine(options.ExtensionPath, "Extension.Assemblies.targets"); + if (!File.Exists(targetsPath)) + { + var content = Templates.GetMatrix42AssembliesTargets(); + File.WriteAllText(targetsPath, content); + } + } + + /// + /// Solution-level files that should live next to the .sln (e.g. BuildEvent.cmd). + /// + private void PrepareSolutionFiles(ExtensionScaffoldingOptions options, string solutionDir) + { + var buildEventPath = Path.Combine(solutionDir, "BuildEvent.cmd"); + if (!File.Exists(buildEventPath)) + { + var content = Templates.BuildEventCmdTemplate.Replace("{ns}", options.ExtensionNamespace); + File.WriteAllText(buildEventPath, content); + } + + // If later you want to actually create the .sln here (for console scenario), + // this is the right place as well. + } + + private static string GetDefaultPackageJson(ExtensionScaffoldingOptions options) => +$@"{{ + ""Id"": ""{options.ExtensionId}"", + ""Vendor"": ""Not Specified"", + ""Name"": ""{options.ExtensionNamespace}"", + ""Version"": ""1.0"", + ""Prerequisites"": {{ + ""MinimalRequiredProductVersion"": ""26.1.0"", + ""DependentPackages"": [] + }}, + ""SetupDirectives"": {{ + ""MaintenanceMode"": false, + ""RecycleWebApplication"": false, + ""RestartM42WindowsServices"": false + }}, + ""Sandboxed"": true +}}"; + + /// + /// Creates {ns}.sln under solutionDir and adds all csproj files to it. + /// + private void GenerateSolutionFile( + ExtensionScaffoldingOptions options, + string solutionDir, + IReadOnlyList projectPaths) + { + if (projectPaths == null || projectPaths.Count == 0) + return; + + var solutionName = options.ExtensionNamespace; + var slnPath = Path.Combine(solutionDir, solutionName + ".sln"); + + // Basic VS solution header + var lines = new List(); + lines.Add("Microsoft Visual Studio Solution File, Format Version 12.00"); + lines.Add("# Visual Studio Version 17"); + lines.Add("VisualStudioVersion = 17.0.31912.275"); + lines.Add("MinimumVisualStudioVersion = 10.0.40219.1"); + + // C# project type GUID + const string csProjTypeGuid = "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"; + + // Collect project GUIDs + var projectEntries = new List>(); + // (projGuid, projName, relativePath) + + foreach (var projPath in projectPaths) + { + var projName = Path.GetFileNameWithoutExtension(projPath); + var relativePath = GetRelativePath(solutionDir, projPath); + var projGuid = "{" + Guid.NewGuid().ToString().ToUpperInvariant() + "}"; + + projectEntries.Add(Tuple.Create(projGuid, projName, relativePath)); + + lines.Add(string.Format( + "Project(\"{0}\") = \"{1}\", \"{2}\", \"{3}\"", + csProjTypeGuid, + projName, + relativePath, + projGuid)); + lines.Add("EndProject"); + } + + // Global section (configs + project configs) + lines.Add("Global"); + lines.Add("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"); + lines.Add("\t\tDebug|Any CPU = Debug|Any CPU"); + lines.Add("\t\tRelease|Any CPU = Release|Any CPU"); + lines.Add("\tEndGlobalSection"); + + lines.Add("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"); + foreach (var entry in projectEntries) + { + var guid = entry.Item1; + lines.Add(string.Format("\t\t{0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU", guid)); + lines.Add(string.Format("\t\t{0}.Debug|Any CPU.Build.0 = Debug|Any CPU", guid)); + lines.Add(string.Format("\t\t{0}.Release|Any CPU.ActiveCfg = Release|Any CPU", guid)); + lines.Add(string.Format("\t\t{0}.Release|Any CPU.Build.0 = Release|Any CPU", guid)); + } + lines.Add("\tEndGlobalSection"); + + lines.Add("\tGlobalSection(SolutionProperties) = preSolution"); + lines.Add("\t\tHideSolutionNode = FALSE"); + lines.Add("\tEndGlobalSection"); + + lines.Add("EndGlobal"); + + File.WriteAllLines(slnPath, lines); + } + + /// + /// Simple helper to get relative path from one folder to a file. + /// + private static string GetRelativePath(string basePath, string fullPath) + { + var baseUri = new Uri(AppendDirectorySeparatorChar(basePath)); + var fullUri = new Uri(fullPath); + var relative = baseUri.MakeRelativeUri(fullUri).ToString(); + + return relative.Replace('/', Path.DirectorySeparatorChar); + } + + private static string AppendDirectorySeparatorChar(string path) + { + return !path.EndsWith(Path.DirectorySeparatorChar.ToString()) ? path + Path.DirectorySeparatorChar : path; + } +} \ No newline at end of file diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/ExtensionScaffoldingOptions.cs b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/ExtensionScaffoldingOptions.cs new file mode 100644 index 0000000..024ea16 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/ExtensionScaffoldingOptions.cs @@ -0,0 +1,30 @@ +using Matrix42.Extensions.Scaffolder.Core.Project; +using System; +using System.Collections.Generic; + +namespace Matrix42.Extensions.Scaffolder.Core +{ + public sealed class ExtensionScaffoldingOptions + { + /// + /// Absolute path where scaffolding should be created. + /// Typically solution directory from VS or some folder from CLI. + /// + public string ExtensionPath { get; set; } + + /// + /// Extension id (Guid) – used in package.json or other metadata. + /// + public Guid ExtensionId { get; set; } + + /// + /// Root namespace, e.g. "Matrix42.MyAwesomeExtension". + /// + public string ExtensionNamespace { get; set; } + + /// + /// Projects to create. + /// + public IReadOnlyList Projects { get; set; } = Array.Empty(); + } +} \ No newline at end of file diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Functionality/IProjectFunctionalityDefinition.cs b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Functionality/IProjectFunctionalityDefinition.cs new file mode 100644 index 0000000..7d5d5d6 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Functionality/IProjectFunctionalityDefinition.cs @@ -0,0 +1,20 @@ +using Matrix42.Extensions.Scaffolder.Core.Project; +using System.Collections.Generic; + +namespace Matrix42.Extensions.Scaffolder.Core.Functionality +{ + public interface IProjectFunctionalityDefinition + { + ProjectFunctionality Kind { get; } + + /// + /// Files to create for this functionality (relative paths, template content). + /// + IEnumerable GetFiles(ExtensionScaffoldingOptions options, ProjectDefinition project); + + /// + /// References to add to the csproj. + /// + IEnumerable GetReferences(ExtensionScaffoldingOptions options, ProjectDefinition project); + } +} diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Functionality/WebApiFunctionalityDefinition.cs b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Functionality/WebApiFunctionalityDefinition.cs new file mode 100644 index 0000000..1cd4790 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Functionality/WebApiFunctionalityDefinition.cs @@ -0,0 +1,65 @@ +using Matrix42.Extensions.Scaffolder.Core.Project; +using System.Collections.Generic; + +namespace Matrix42.Extensions.Scaffolder.Core.Functionality +{ + public sealed class WebApiFunctionalityDefinition : IProjectFunctionalityDefinition + { + public ProjectFunctionality Kind => ProjectFunctionality.WebApi; + + public IEnumerable GetFiles( + ExtensionScaffoldingOptions options, + ProjectDefinition project) + { + var ns = options.ExtensionNamespace; + + yield return new TemplateFile + { + RelativePath = @"Controllers\TestController.cs", + Content = WebApi_TestControllerTemplate.Replace("{ns}", ns), + CreateIfMissingOnly = true + }; + } + + public IEnumerable GetReferences(ExtensionScaffoldingOptions options, ProjectDefinition project) + { + yield return new ProjectReferenceDefinition + { + Include = "Matrix42.WebApi.Contracts", + HintPath = @"..\..\..\..\Root\bin\Matrix42.WebApi.Contracts.dll" + }; + + yield return new ProjectReferenceDefinition + { + Include = "Matrix42.Hosting.Contracts", + HintPath = @"..\..\..\..\Root\bin\Matrix42.Hosting.Contracts.dll" + }; + } + + private const string WebApi_TestControllerTemplate = +@" +using Matrix42.WebApi.Contracts; +using Matrix42.Hosting.Contracts; + +namespace {ns}.Services +{ + [RoutePrefix(""api/test"")] + public class TestController : ApiController + { + private readonly IDependencyResolver _resolver; + + public TestController(IDependencyResolver resolver) + { + _resolver = resolver; + } + + [HttpPost, Route(""test"")] + public string TestMethod() + { + // TODO: implement your test method logic + return ""OK""; + } + } +}"; + } +} diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/IExtensionScaffolder.cs b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/IExtensionScaffolder.cs new file mode 100644 index 0000000..9059e21 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/IExtensionScaffolder.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; + +namespace Matrix42.Extensions.Scaffolder.Core; + +public interface IExtensionScaffolder +{ + /// + /// Generates all files/folders according to options and returns the list of generated csproj paths. + /// + IReadOnlyList Generate(ExtensionScaffoldingOptions options); +} diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Matrix42.Extensions.Scaffolder.Core.csproj b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Matrix42.Extensions.Scaffolder.Core.csproj new file mode 100644 index 0000000..3b709bc --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Matrix42.Extensions.Scaffolder.Core.csproj @@ -0,0 +1,13 @@ + + + + netstandard2.0 + 11.0 + + + + + + + + diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Project/ProjectDefinition.cs b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Project/ProjectDefinition.cs new file mode 100644 index 0000000..cd71f74 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Project/ProjectDefinition.cs @@ -0,0 +1,54 @@ +using System.Collections.Generic; + +namespace Matrix42.Extensions.Scaffolder.Core.Project; + +public class ProjectDefinition +{ + /// + /// E.g. "Services", "BizLogic", etc. + /// If empty, project name will be equal to ExtensionNamespace. + /// + public string Prefix { get; set; } = string.Empty; + + public RuntimeTargets Runtimes { get; set; } + + /// + /// Combination of functionality flags: WebApi, Engine, Behavior, Connector, Custom. + /// + public ProjectFunctionality Functionality { get; set; } = ProjectFunctionality.None; + + public string Display => $"Prefix: {Prefix} - Runtimes: {Runtimes} - Functionality: {Functionality}"; + + public string GetProjectName(string extensionNamespace) + { + var pfx = Prefix?.Trim(); + return string.IsNullOrWhiteSpace(pfx) + ? extensionNamespace + : $"{extensionNamespace}.{pfx}"; + } + + public string GetNamespace(string extensionNamespace) => GetProjectName(extensionNamespace); + + public bool DoesSupportAllRuntimes() => Runtimes.HasFlag(RuntimeTargets.All); + + public string GetRuntimeIdentifiers() + { + if (DoesSupportAllRuntimes()) + { + return "netstandard2.0"; + } + + var list = new List(); + if (Runtimes.HasFlag(RuntimeTargets.Win) || Runtimes.HasFlag(RuntimeTargets.WinCore)) + { + list.Add("win-x64"); + } + + if (Runtimes.HasFlag(RuntimeTargets.LinuxCore)) + { + list.Add("linux-x64"); + } + + return string.Join(";", list); + } +} \ No newline at end of file diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Project/ProjectFunctionality.cs b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Project/ProjectFunctionality.cs new file mode 100644 index 0000000..3972867 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Project/ProjectFunctionality.cs @@ -0,0 +1,23 @@ +using System; + +namespace Matrix42.Extensions.Scaffolder.Core.Project; + +[Flags] +public enum ProjectFunctionality +{ + None = 0, + WebApi = 1, + Engine = 2, + Behavior = 4, + Connector = 8, + Custom = 16 +} + +[Flags] +public enum RuntimeTargets +{ + Win = 1, + WinCore = 2, + LinuxCore = 4, + All = 8 +} \ No newline at end of file diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Project/ProjectReferenceDefinition.cs b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Project/ProjectReferenceDefinition.cs new file mode 100644 index 0000000..6b9d4fd --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Project/ProjectReferenceDefinition.cs @@ -0,0 +1,11 @@ +namespace Matrix42.Extensions.Scaffolder.Core.Project +{ + /// + /// Describes a single extra reference to put in the csproj. + /// + public sealed class ProjectReferenceDefinition + { + public string Include { get; set; } + public string HintPath { get; set; } + } +} \ No newline at end of file diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/ProjectGenerators/DefaultProjectGenerator.cs b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/ProjectGenerators/DefaultProjectGenerator.cs new file mode 100644 index 0000000..b84ce00 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/ProjectGenerators/DefaultProjectGenerator.cs @@ -0,0 +1,200 @@ +using Matrix42.Extensions.Scaffolder.Core.Functionality; +using Matrix42.Extensions.Scaffolder.Core.Project; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; + +namespace Matrix42.Extensions.Scaffolder.Core.ProjectGenerators +{ + internal class DefaultProjectGenerator + { + private readonly IReadOnlyList _functionalityDefinitions; + + public DefaultProjectGenerator() + { + _functionalityDefinitions = new IProjectFunctionalityDefinition[] + { + new WebApiFunctionalityDefinition(), + // new EngineFunctionalityDefinition(), + // new BehaviorFunctionalityDefinition(), + // new ConnectorFunctionalityDefinition(), + // new CustomFunctionalityDefinition(), + }; + } + + public string GenerateProject(ExtensionScaffoldingOptions options, ProjectDefinition def) + { + var ns = options.ExtensionNamespace; + var projectName = def.GetProjectName(ns); // e.g. Matrix42.MyExt.Services + + var solutionDir = Path.Combine(options.ExtensionPath, "Solutions", options.ExtensionNamespace); + Directory.CreateDirectory(solutionDir); + + var projectDir = Path.Combine(solutionDir, projectName); + Directory.CreateDirectory(projectDir); + + var csprojPath = Path.Combine(projectDir, $"{projectName}.csproj"); + + GenerateCsproj(csprojPath, def, options, projectName, ns, CollectFunctionalityReferences(options, def)); + GenerateHostFile(projectDir, projectName); + GenerateFiles(projectDir, CollectFunctionalityFiles(options, def)); + + return csprojPath; + } + + #region Csproj / Host + + protected virtual void GenerateCsproj( + string csprojPath, + ProjectDefinition def, + ExtensionScaffoldingOptions options, + string projectName, + string rootNamespace, + IReadOnlyList extraReferences) + { + var allRuntimes = def.DoesSupportAllRuntimes(); + + var tfm = allRuntimes ? def.GetRuntimeIdentifiers() : "net8.0"; // Todo: dynamic based on runtimes + var runtimeIds = def.GetRuntimeIdentifiers(); + + var anyRids = !allRuntimes && !string.IsNullOrWhiteSpace(runtimeIds); + var ridBlock = anyRids ? $"{runtimeIds}{Environment.NewLine}" : string.Empty; + + var referencesXml = BuildReferencesXml(extraReferences); + + var content = +$@" + + {tfm} + Library + {rootNamespace} + {ridBlock} + true + enable + enable + latestmajor + $(MSBuildProjectDirectory)\..\..\..\BasePackage\Assemblies\ + + +{referencesXml} + + + {options.ExtensionId} + $(MSBuildProjectName)*.* + {anyRids.ToString().ToLowerInvariant()} + + + + +"; + + File.WriteAllText(csprojPath, content); + } + + protected virtual void GenerateHostFile(string projectDir, string projectName) + { + var hostFileName = $"{projectName}.dll.host"; + var hostPath = Path.Combine(projectDir, hostFileName); + + if (!File.Exists(hostPath)) + { + File.WriteAllText(hostPath, Templates.DefaultHostFileContent); + } + } + + private static string BuildReferencesXml(IEnumerable refs) + { + var list = refs?.ToList() ?? new List(); + if (list.Count == 0) + return string.Empty; + + var sb = new StringBuilder(); + sb.AppendLine(" "); + + foreach (var r in list) + { + sb.AppendLine($@" "); + if (!string.IsNullOrWhiteSpace(r.HintPath)) + { + sb.AppendLine($@" {r.HintPath}"); + } + sb.AppendLine(" "); + } + + sb.AppendLine(" "); + return sb.ToString(); + } + + #endregion + + #region Functionality integration (files + references) + + /// + /// Collects files to generate from all enabled functionalities. + /// + protected virtual IReadOnlyList CollectFunctionalityFiles( + ExtensionScaffoldingOptions options, ProjectDefinition def) + { + var result = new List(); + var flags = def.Functionality; + + foreach (var defn in _functionalityDefinitions) + { + if (!flags.HasFlag(defn.Kind)) + { + continue; + } + + result.AddRange(defn.GetFiles(options, def)); + } + + return result; + } + + /// + /// Collects references to add to csproj from all enabled functionalities. + /// + protected virtual IReadOnlyList CollectFunctionalityReferences( + ExtensionScaffoldingOptions options, ProjectDefinition def) + { + var result = new List(); + var flags = def.Functionality; + + foreach (var defn in _functionalityDefinitions) + { + if (!flags.HasFlag(defn.Kind)) + { + continue; + } + + result.AddRange(defn.GetReferences(options, def)); + } + + return result; + } + + protected virtual void GenerateFiles(string projectDir, IReadOnlyList files) + { + foreach (var file in files) + { + var targetPath = Path.Combine(projectDir, file.RelativePath); + var targetDir = Path.GetDirectoryName(targetPath); + if (!string.IsNullOrEmpty(targetDir)) + { + Directory.CreateDirectory(targetDir); + } + + if (file.CreateIfMissingOnly && File.Exists(targetPath)) + { + continue; + } + + File.WriteAllText(targetPath, file.Content); + } + } + + #endregion + } +} \ No newline at end of file diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/ProjectGenerators/IProjectGenerator.cs b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/ProjectGenerators/IProjectGenerator.cs new file mode 100644 index 0000000..44daba7 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/ProjectGenerators/IProjectGenerator.cs @@ -0,0 +1,12 @@ +using Matrix42.Extensions.Scaffolder.Core.Project; +using System.Collections.Generic; + +namespace Matrix42.Extensions.Scaffolder.Core.ProjectGenerators; + +internal interface IProjectGenerator +{ + /// + /// Generates the project and returns the path to the created .csproj file. + /// + string GenerateProject(ExtensionScaffoldingOptions options, ProjectDefinition def); +} diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/TemplateFile.cs b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/TemplateFile.cs new file mode 100644 index 0000000..26e9491 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/TemplateFile.cs @@ -0,0 +1,26 @@ +namespace Matrix42.Extensions.Scaffolder.Core +{ + /// + /// Describes a single file to generate from a template. + /// + public sealed class TemplateFile + { + /// + /// Path relative to project folder (for project files) + /// or ExtensionPath (for root-level files). + /// Example: "Controllers\\TestController.cs" or "BuildEvent.cmd". + /// + public string RelativePath { get; set; } + + /// + /// Template content (with tokens like {ns}, {projectName} etc.). + /// + public string Content { get; set; } + + /// + /// If true, file is only created if it doesn't exist. + /// If false, it will be overwritten. + /// + public bool CreateIfMissingOnly { get; set; } = true; + } +} diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Templates.cs b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Templates.cs new file mode 100644 index 0000000..397e28e --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/Templates.cs @@ -0,0 +1,91 @@ +using System.IO; + +namespace Matrix42.Extensions.Scaffolder.Core +{ + internal static class Templates + { + public const string Gitignore = @" +.idea/ +.vs/ +.vscode/ +node_modules/ +dist/ + +package-lock.json +workspace.json + +.vs/ +.libs/ +.build/ + +bin/ +obj/ + +*.user + +/**/AssemblyInfoProduct.cs +/**/_Resharper.Caches +/Solutions/*.sln.DotSettings.user +/Solutions/**/*.csproj.user +/Solutions/**/packages/*.* +/Solutions/**/**/AssemblyInfoProduct.cs +/Solutions/TestResult/*.* + +BasePackage/Assemblies/ +"; + + public const string PrepareVeracodeScanCmd = @"set arch=""C:\Program Files\7-Zip\7z.exe"" +echo [*] Building backend archive... +%arch% a -tzip -mx5 -x!*.config %Build_ArtifactStagingDirectory%\{ns}.zip %BaseDir%\Solutions\{ns}\.build\*.* +"; + + public const string DefaultHostFileContent = +@" + + + + +"; + + public const string BuildEventCmdTemplate = +@"call %~dps0..\..\TeamBuildEvent.cmd %1 %2 %3 ""/Solutions/{ns}"""; + + internal static string GetMatrix42AssembliesTargets() + { + var asm = typeof(Templates).Assembly; + const string resourceName = "Matrix42.Extensions.Scaffolder.Core.Extension.Assemblies.targets"; + + using (var stream = asm.GetManifestResourceStream(resourceName)) + { + if (stream == null) + { + throw new FileNotFoundException($"Embedded resource '{resourceName}' not found in assembly '{asm.FullName}'."); + } + + using (var reader = new StreamReader(stream)) + { + return reader.ReadToEnd(); + } + } + } + + internal static string GetAzurePiplineCi() + { + var asm = typeof(Templates).Assembly; + const string resourceName = "Matrix42.Extensions.Scaffolder.Core.azure-pipelines-ci.yaml"; + + using (var stream = asm.GetManifestResourceStream(resourceName)) + { + if (stream == null) + { + throw new FileNotFoundException($"Embedded resource '{resourceName}' not found in assembly '{asm.FullName}'."); + } + + using (var reader = new StreamReader(stream)) + { + return reader.ReadToEnd(); + } + } + } + } +} \ No newline at end of file diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/azure-pipelines-ci.yaml b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/azure-pipelines-ci.yaml new file mode 100644 index 0000000..554f140 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Core/azure-pipelines-ci.yaml @@ -0,0 +1,123 @@ +# azure-pipelines.yml +pr: none + +trigger: + branches: + include: + - release_26_1_0 + paths: + include: + - 'Solutions/**' + +parameters: + - name: BaseDir + type: string + default: $(Build.SourcesDirectory) + + - name: SuiteRarShare + type: string + default: '\\m42-sto-ffm01.matrix42.de\ServiceStore\Builds\TitanLinux Continuous' + + - name: RepoName + type: string + default: '{repoName}' + + - name: SolutionName + type: string + default: '{ns}' + +variables: + - name: BaseDir + value: ${{ parameters.BaseDir }} + + - name: ExtensionTarget + value: ${{ parameters.BaseDir }}/${{ parameters.RepoName }} + + - name: SolutionDir + value: $(ExtensionTarget)/Solutions/{ns} + + - name: SolutionPath + value: $(SolutionDir)/{ns}.sln + + # Tests + - name: TestsDir + value: $(SolutionDir) + - name: TestProject + value: '{ns}.Tests/{ns}.Tests.csproj' + +stages: +- stage: Build + displayName: 'Build ${{ parameters.RepoName }}' + jobs: + - job: Build_Backend + displayName: 'Build, Test, Package' + pool: + name: M42BPM + demands: + - DotNetFramework + - vstest + + steps: + - task: CopyFiles@2 + displayName: 'Copy extension $(ExtensionTarget) source files' + inputs: + SourceFolder: '${{ parameters.BaseDir }}' + Contents: '**' + TargetFolder: '$(ExtensionTarget)' + + - task: CopyFiles@2 + displayName: 'Copy suite.rar' + inputs: + SourceFolder: '${{ parameters.SuiteRarShare }}' + Contents: 'suite.rar' + TargetFolder: '${{ parameters.BaseDir }}' + OverWrite: true + + - task: ExtractFiles@1 + displayName: 'Extract suite.rar' + inputs: + archiveFilePatterns: '${{ parameters.BaseDir }}/suite.rar' + destinationFolder: '${{ parameters.BaseDir }}' + cleanDestinationFolder: false + overwriteExistingFiles: true + + - task: DotNetCoreCLI@2 + displayName: 'Restore $(ExtensionTarget) solution' + inputs: + command: 'restore' + projects: '$(SolutionPath)' + + # Optional: override default RIDs globally if needed: -p:M42DefaultRids=win-x64;linux-x64 + - task: DotNetCoreCLI@2 + displayName: 'Build {ns} solution' + inputs: + command: 'build' + projects: '$(SolutionPath)' + arguments: > + -c Release + --no-restore + -p:SolutionDir=$(SolutionDir)\ + -p:M42BuildAllRidsOnCI=true + + - task: DotNetCoreCLI@2 + displayName: 'Test (net8.0)' + inputs: + command: 'test' + projects: '$(TestsDir)/$(TestProject)' + arguments: '-c Release -f net8.0 --no-build' + + - task: ArchiveFiles@2 + displayName: 'Zip $(ExtensionTarget) BasePackage' + inputs: + rootFolderOrFile: '$(ExtensionTarget)/BasePackage' + includeRootFolder: false + archiveType: 'zip' + sevenZipCompression: 'normal' + archiveFile: '$(Build.ArtifactStagingDirectory)/${{ parameters.RepoName }}_1.0.zip' + replaceExistingArchive: true + + - task: PublishPipelineArtifact@1 + displayName: 'Publish ${{ parameters.RepoName }}_1.0.zip' + inputs: + targetPath: '$(Build.ArtifactStagingDirectory)/${{ parameters.RepoName }}_1.0.zip' + artifact: '${{ parameters.RepoName }}' diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Matrix42.Extensions.Scaffolder.Vsix.csproj b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Matrix42.Extensions.Scaffolder.Vsix.csproj new file mode 100644 index 0000000..4fffac4 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Matrix42.Extensions.Scaffolder.Vsix.csproj @@ -0,0 +1,91 @@ + + + + 17.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + Debug + AnyCPU + 2.0 + {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + {50F8DCAA-48B9-47D5-ABB8-F8D33BEF1BD1} + Library + Properties + Matrix42.Extensions.Scaffolder.Vsix + Matrix42.Extensions.Scaffolder.Vsix + v4.7.2 + true + true + true + false + false + true + true + Program + $(DevEnvDir)devenv.exe + /rootsuffix Exp + false + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + Form + + + WizardForm.cs + + + + + + + Designer + + + + + + + + + + + 17.10.40170 + + + + + + + + + + \ No newline at end of file diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Matrix42.Extensions.Scaffolder.Vsix.sln b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Matrix42.Extensions.Scaffolder.Vsix.sln new file mode 100644 index 0000000..db9c477 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Matrix42.Extensions.Scaffolder.Vsix.sln @@ -0,0 +1,37 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36310.24 d17.14 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Matrix42.Extensions.Scaffolder.Vsix", "Matrix42.Extensions.Scaffolder.Vsix.csproj", "{50F8DCAA-48B9-47D5-ABB8-F8D33BEF1BD1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|arm64 = Debug|arm64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|arm64 = Release|arm64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {50F8DCAA-48B9-47D5-ABB8-F8D33BEF1BD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {50F8DCAA-48B9-47D5-ABB8-F8D33BEF1BD1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {50F8DCAA-48B9-47D5-ABB8-F8D33BEF1BD1}.Debug|arm64.ActiveCfg = Debug|arm64 + {50F8DCAA-48B9-47D5-ABB8-F8D33BEF1BD1}.Debug|arm64.Build.0 = Debug|arm64 + {50F8DCAA-48B9-47D5-ABB8-F8D33BEF1BD1}.Debug|x86.ActiveCfg = Debug|x86 + {50F8DCAA-48B9-47D5-ABB8-F8D33BEF1BD1}.Debug|x86.Build.0 = Debug|x86 + {50F8DCAA-48B9-47D5-ABB8-F8D33BEF1BD1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {50F8DCAA-48B9-47D5-ABB8-F8D33BEF1BD1}.Release|Any CPU.Build.0 = Release|Any CPU + {50F8DCAA-48B9-47D5-ABB8-F8D33BEF1BD1}.Release|arm64.ActiveCfg = Release|arm64 + {50F8DCAA-48B9-47D5-ABB8-F8D33BEF1BD1}.Release|arm64.Build.0 = Release|arm64 + {50F8DCAA-48B9-47D5-ABB8-F8D33BEF1BD1}.Release|x86.ActiveCfg = Release|x86 + {50F8DCAA-48B9-47D5-ABB8-F8D33BEF1BD1}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {ECBF8D8B-3FBE-4CDA-BE52-C37D76054B09} + EndGlobalSection +EndGlobal diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/ProjectTemplates/Directory.Build.props.template b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/ProjectTemplates/Directory.Build.props.template new file mode 100644 index 0000000..b6c82f2 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/ProjectTemplates/Directory.Build.props.template @@ -0,0 +1,7 @@ + + + latest + enable + enable + + diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/ProjectTemplates/ExtensionSolution.vstemplate b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/ProjectTemplates/ExtensionSolution.vstemplate new file mode 100644 index 0000000..3a24124 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/ProjectTemplates/ExtensionSolution.vstemplate @@ -0,0 +1,21 @@ + + + Matrix42 Extension Solution + Create a new Matrix42 extension solution (WebApi / Contracts / BizLogic / Custom) using Matrix42.Extensions.SDK. + CSharp + 1000 + Matrix42.Extension + true + true + Enabled + + + + + + + + Matrix42.Extensions.Scaffolder.Vsix, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + Matrix42.Extensions.Scaffolder.Wizard.ExtensionProjectsWizard + + diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/ProjectTemplates/Placeholder.csproj b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/ProjectTemplates/Placeholder.csproj new file mode 100644 index 0000000..f6d7bc3 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/ProjectTemplates/Placeholder.csproj @@ -0,0 +1,6 @@ + + + net8.0 + Library + + diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Properties/AssemblyInfo.cs b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..beb3f48 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Matrix42.Extensions.Scaffolder.Vsix")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Matrix42.Extensions.Scaffolder.Vsix")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// 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)] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Wizard/ExtensionProjectsWizard.cs b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Wizard/ExtensionProjectsWizard.cs new file mode 100644 index 0000000..f744a48 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Wizard/ExtensionProjectsWizard.cs @@ -0,0 +1,231 @@ +using System; +using System.Collections.Generic; +using System.IO; +using EnvDTE; +using EnvDTE80; +using Microsoft.VisualStudio.TemplateWizard; + +namespace Matrix42.Extensions.Scaffolder.Wizard +{ + public class ExtensionProjectsWizard : IWizard + { + private DTE2 _dte; + private Project _placeholderProject; + private string _extensionNamespace = string.Empty; + private List _projects = new List(); + private string _solutionDirectory = string.Empty; + + public void RunStarted( + object automationObject, + Dictionary replacementsDictionary, + WizardRunKind runKind, + object[] customParams) + { + _dte = automationObject as DTE2 + ?? throw new InvalidOperationException("DTE2 not available."); + + using (var form = new WizardForm()) + { + var result = form.ShowDialog(); + if (result != System.Windows.Forms.DialogResult.OK) + throw new WizardBackoutException(); + + _extensionNamespace = form.ExtensionNamespace; + _projects = new List(form.Projects); + } + } + + // 🔹 This is the method that was missing + public void BeforeOpeningFile(ProjectItem projectItem) + { + // We don't need to do anything before a file is opened. + // Leave empty on purpose. + } + + public void ProjectFinishedGenerating(Project project) + { + _placeholderProject = project; + } + + public void ProjectItemFinishedGenerating(ProjectItem projectItem) + { + } + + public void RunFinished() + { + var solution = _dte.Solution; + _solutionDirectory = Path.GetDirectoryName(solution.FullName); + + if (string.IsNullOrEmpty(_solutionDirectory)) + return; + + // Remove placeholder project from solution and disk + if (_placeholderProject != null) + { + var placeholderPath = _placeholderProject.FullName; + solution.Remove(_placeholderProject); + TryDeleteDirectorySafe(Path.GetDirectoryName(placeholderPath)); + } + + // Drop Directory.Build.props + var propsTemplatePath = Path.Combine( + GetExtensionInstallPath(), + "ProjectTemplates", + "Directory.Build.props.template"); + + if (File.Exists(propsTemplatePath)) + { + var destProps = Path.Combine(_solutionDirectory, "Directory.Build.props"); + if (!File.Exists(destProps)) + File.Copy(propsTemplatePath, destProps, overwrite: false); + } + + foreach (var proj in _projects) + { + CreateProjectFromDefinition(solution, proj); + } + } + + public bool ShouldAddProjectItem(string filePath) => true; + + private void CreateProjectFromDefinition(Solution solution, ProjectDefinition def) + { + var projectName = def.GetProjectName(_extensionNamespace); + var projectNamespace = def.GetNamespace(_extensionNamespace); + var projectDir = Path.Combine(_solutionDirectory, projectName); + + Directory.CreateDirectory(projectDir); + + var csprojPath = Path.Combine(projectDir, projectName + ".csproj"); + var runtimeIds = def.GetRuntimeIdentifiers(); + var tfm = "net8.0"; // default target framework + + var csprojContent = GenerateCsproj(def.Type, tfm, runtimeIds, projectNamespace); + File.WriteAllText(csprojPath, csprojContent); + + var codeFilePath = Path.Combine( + projectDir, + def.Type == ProjectType.WebApi ? "Program.cs" : "Class1.cs"); + + var codeContent = GenerateCodeFile(def.Type, projectNamespace); + File.WriteAllText(codeFilePath, codeContent); + + solution.AddFromFile(csprojPath); + } + + private string GenerateCsproj( + ProjectType type, + string tfm, + string runtimeIds, + string rootNamespace) + { + var outputType = type == ProjectType.WebApi ? "Exe" : "Library"; + var sdk = type == ProjectType.WebApi ? "Microsoft.NET.Sdk.Web" : "Microsoft.NET.Sdk"; + + var ridBlock = string.IsNullOrWhiteSpace(runtimeIds) + ? string.Empty + : $" {runtimeIds}{Environment.NewLine}"; + + return +$@" + + {tfm} + {outputType} + {rootNamespace} + + + +{ridBlock} + + + + + +"; + } + + private string GenerateCodeFile(ProjectType type, string ns) + { + switch (type) + { + case ProjectType.WebApi: + return +$@"using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Matrix42.Extensions.SDK; + +namespace {ns} +{{ + public class Program + {{ + public static void Main(string[] args) + {{ + var builder = WebApplication.CreateBuilder(args); + + builder.Services.AddControllers(); + // TODO: configure Matrix42.Extensions.SDK services + + var app = builder.Build(); + app.MapControllers(); + + app.Run(); + }} + }} +}}"; + case ProjectType.Contracts: + return +$@"namespace {ns} +{{ + // Place your contracts (DTOs, interfaces) here + public class SampleContract + {{ + public string Id {{ get; set; }} = string.Empty; + }} +}}"; + case ProjectType.BizLogic: + return +$@"using Matrix42.Extensions.SDK; + +namespace {ns} +{{ + // Place your business logic services here + public class SampleService + {{ + public string SayHello() => ""Hello from {ns}""; + }} +}}"; + case ProjectType.Custom: + default: + return +$@"namespace {ns} +{{ + // Custom project for your extension + public class CustomEntry + {{ + public string Name {{ get; set; }} = ""Custom""; + }} +}}"; + } + } + + private string GetExtensionInstallPath() + { + var asmPath = typeof(ExtensionProjectsWizard).Assembly.Location; + return Path.GetDirectoryName(asmPath); + } + + private void TryDeleteDirectorySafe(string path) + { + try + { + if (!string.IsNullOrWhiteSpace(path) && Directory.Exists(path)) + Directory.Delete(path, recursive: true); + } + catch + { + // ignore + } + } + } +} \ No newline at end of file diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Wizard/ProjectDefinition.cs b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Wizard/ProjectDefinition.cs new file mode 100644 index 0000000..5fb6b35 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Wizard/ProjectDefinition.cs @@ -0,0 +1,66 @@ +using System.Collections.Generic; + +namespace Matrix42.Extensions.Scaffolder.Wizard +{ + public enum ProjectType + { + WebApi, + Contracts, + BizLogic, + Custom + } + + public class ProjectDefinition + { + public ProjectType Type { get; set; } + public string Prefix { get; set; } = string.Empty; // custom for Custom type, otherwise derived + public RuntimeTargets Runtimes { get; set; } + + public string EffectivePrefix + { + get + { + if (Type == ProjectType.Custom) + return Prefix; + + switch (Type) + { + case ProjectType.WebApi: + return string.IsNullOrWhiteSpace(Prefix) ? "Services" : Prefix; + case ProjectType.Contracts: + return string.IsNullOrWhiteSpace(Prefix) ? "Contracts" : Prefix; + case ProjectType.BizLogic: + return string.IsNullOrWhiteSpace(Prefix) ? "BizLogic" : Prefix; + default: + return Prefix; + } + } + } + + public string Display => $"{Type} - Prefix: {EffectivePrefix} - Runtimes: {Runtimes}"; + + public string GetProjectName(string extensionNamespace) + { + var pfx = EffectivePrefix?.Trim(); + return string.IsNullOrWhiteSpace(pfx) + ? extensionNamespace + : $"{extensionNamespace}.{pfx}"; + } + + public string GetNamespace(string extensionNamespace) => GetProjectName(extensionNamespace); + + public string GetRuntimeIdentifiers() + { + if (Runtimes.HasFlag(RuntimeTargets.All)) + return "win-x64;linux-x64"; + + var list = new List(); + if (Runtimes.HasFlag(RuntimeTargets.Win) || Runtimes.HasFlag(RuntimeTargets.WinCore)) + list.Add("win-x64"); + if (Runtimes.HasFlag(RuntimeTargets.LinuxCore)) + list.Add("linux-x64"); + + return string.Join(";", list); + } + } +} diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Wizard/RuntimeTargets.cs b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Wizard/RuntimeTargets.cs new file mode 100644 index 0000000..11ab608 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Wizard/RuntimeTargets.cs @@ -0,0 +1,12 @@ +namespace Matrix42.Extensions.Scaffolder.Wizard +{ + [System.Flags] + public enum RuntimeTargets + { + None = 0, + Win = 1, + WinCore = 2, + LinuxCore = 4, + All = 8 + } +} diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Wizard/WizardForm.Designer.cs b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Wizard/WizardForm.Designer.cs new file mode 100644 index 0000000..0854044 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Wizard/WizardForm.Designer.cs @@ -0,0 +1,236 @@ +namespace Matrix42.Extensions.Scaffolder.Wizard +{ + partial class WizardForm + { + private System.ComponentModel.IContainer components = null; + + private System.Windows.Forms.Label lblTitle; + private System.Windows.Forms.Label lblExtensionNamespace; + private System.Windows.Forms.TextBox txtExtensionNamespace; + private System.Windows.Forms.Label lblHint; + private System.Windows.Forms.Label lblAddProjects; + private System.Windows.Forms.Label lblProjectType; + private System.Windows.Forms.ComboBox cboProjectType; + private System.Windows.Forms.Label lblProjectPrefix; + private System.Windows.Forms.TextBox txtProjectPrefix; + private System.Windows.Forms.Label lblRuntimes; + private System.Windows.Forms.CheckedListBox clbRuntimes; + private System.Windows.Forms.Button btnAddProject; + private System.Windows.Forms.ListBox lstProjects; + private System.Windows.Forms.Button btnRemoveSelected; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Button btnCancel; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + components.Dispose(); + base.Dispose(disposing); + } + + private void InitializeComponent() + { + this.lblTitle = new System.Windows.Forms.Label(); + this.lblExtensionNamespace = new System.Windows.Forms.Label(); + this.txtExtensionNamespace = new System.Windows.Forms.TextBox(); + this.lblHint = new System.Windows.Forms.Label(); + this.lblAddProjects = new System.Windows.Forms.Label(); + this.lblProjectType = new System.Windows.Forms.Label(); + this.cboProjectType = new System.Windows.Forms.ComboBox(); + this.lblProjectPrefix = new System.Windows.Forms.Label(); + this.txtProjectPrefix = new System.Windows.Forms.TextBox(); + this.lblRuntimes = new System.Windows.Forms.Label(); + this.clbRuntimes = new System.Windows.Forms.CheckedListBox(); + this.btnAddProject = new System.Windows.Forms.Button(); + this.lstProjects = new System.Windows.Forms.ListBox(); + this.btnRemoveSelected = new System.Windows.Forms.Button(); + this.btnOK = new System.Windows.Forms.Button(); + this.btnCancel = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // lblTitle + // + this.lblTitle.AutoSize = true; + this.lblTitle.Font = new System.Drawing.Font("Segoe UI", 11F, System.Drawing.FontStyle.Bold); + this.lblTitle.Location = new System.Drawing.Point(12, 9); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(120, 20); + this.lblTitle.TabIndex = 0; + this.lblTitle.Text = "Projects Wizard"; + // + // lblExtensionNamespace + // + this.lblExtensionNamespace.AutoSize = true; + this.lblExtensionNamespace.Location = new System.Drawing.Point(13, 44); + this.lblExtensionNamespace.Name = "lblExtensionNamespace"; + this.lblExtensionNamespace.Size = new System.Drawing.Size(113, 15); + this.lblExtensionNamespace.TabIndex = 1; + this.lblExtensionNamespace.Text = "Extension Namespace"; + // + // txtExtensionNamespace + // + this.txtExtensionNamespace.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtExtensionNamespace.Location = new System.Drawing.Point(16, 62); + this.txtExtensionNamespace.Name = "txtExtensionNamespace"; + this.txtExtensionNamespace.Size = new System.Drawing.Size(444, 23); + this.txtExtensionNamespace.TabIndex = 2; + // + // lblHint + // + this.lblHint.AutoSize = true; + this.lblHint.Location = new System.Drawing.Point(466, 65); + this.lblHint.Name = "lblHint"; + this.lblHint.Size = new System.Drawing.Size(121, 15); + this.lblHint.TabIndex = 3; + this.lblHint.Text = "aka Matrix42.MyExtension"; + // + // lblAddProjects + // + this.lblAddProjects.AutoSize = true; + this.lblAddProjects.Location = new System.Drawing.Point(13, 103); + this.lblAddProjects.Name = "lblAddProjects"; + this.lblAddProjects.Size = new System.Drawing.Size(71, 15); + this.lblAddProjects.TabIndex = 4; + this.lblAddProjects.Text = "Add Projects"; + // + // lblProjectType + // + this.lblProjectType.AutoSize = true; + this.lblProjectType.Location = new System.Drawing.Point(13, 129); + this.lblProjectType.Name = "lblProjectType"; + this.lblProjectType.Size = new System.Drawing.Size(70, 15); + this.lblProjectType.TabIndex = 5; + this.lblProjectType.Text = "Project Type"; + // + // cboProjectType + // + this.cboProjectType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboProjectType.FormattingEnabled = true; + this.cboProjectType.Location = new System.Drawing.Point(16, 147); + this.cboProjectType.Name = "cboProjectType"; + this.cboProjectType.Size = new System.Drawing.Size(150, 23); + this.cboProjectType.TabIndex = 6; + // + // lblProjectPrefix + // + this.lblProjectPrefix.AutoSize = true; + this.lblProjectPrefix.Location = new System.Drawing.Point(179, 129); + this.lblProjectPrefix.Name = "lblProjectPrefix"; + this.lblProjectPrefix.Size = new System.Drawing.Size(75, 15); + this.lblProjectPrefix.TabIndex = 7; + this.lblProjectPrefix.Text = "Project Prefix"; + // + // txtProjectPrefix + // + this.txtProjectPrefix.Location = new System.Drawing.Point(182, 147); + this.txtProjectPrefix.Name = "txtProjectPrefix"; + this.txtProjectPrefix.Size = new System.Drawing.Size(150, 23); + this.txtProjectPrefix.TabIndex = 8; + // + // lblRuntimes + // + this.lblRuntimes.AutoSize = true; + this.lblRuntimes.Location = new System.Drawing.Point(345, 129); + this.lblRuntimes.Name = "lblRuntimes"; + this.lblRuntimes.Size = new System.Drawing.Size(121, 15); + this.lblRuntimes.TabIndex = 9; + this.lblRuntimes.Text = "Runtimes (multiselect)"; + // + // clbRuntimes + // + this.clbRuntimes.CheckOnClick = true; + this.clbRuntimes.FormattingEnabled = true; + this.clbRuntimes.Location = new System.Drawing.Point(348, 147); + this.clbRuntimes.Name = "clbRuntimes"; + this.clbRuntimes.Size = new System.Drawing.Size(150, 76); + this.clbRuntimes.TabIndex = 10; + // + // btnAddProject + // + this.btnAddProject.Location = new System.Drawing.Point(504, 147); + this.btnAddProject.Name = "btnAddProject"; + this.btnAddProject.Size = new System.Drawing.Size(75, 23); + this.btnAddProject.TabIndex = 11; + this.btnAddProject.Text = "Add"; + this.btnAddProject.UseVisualStyleBackColor = true; + this.btnAddProject.Click += new System.EventHandler(this.btnAddProject_Click); + // + // lstProjects + // + this.lstProjects.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lstProjects.FormattingEnabled = true; + this.lstProjects.ItemHeight = 15; + this.lstProjects.Location = new System.Drawing.Point(16, 236); + this.lstProjects.Name = "lstProjects"; + this.lstProjects.Size = new System.Drawing.Size(563, 139); + this.lstProjects.TabIndex = 12; + // + // btnRemoveSelected + // + this.btnRemoveSelected.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.btnRemoveSelected.Location = new System.Drawing.Point(16, 385); + this.btnRemoveSelected.Name = "btnRemoveSelected"; + this.btnRemoveSelected.Size = new System.Drawing.Size(120, 23); + this.btnRemoveSelected.TabIndex = 13; + this.btnRemoveSelected.Text = "Remove selected"; + this.btnRemoveSelected.UseVisualStyleBackColor = true; + this.btnRemoveSelected.Click += new System.EventHandler(this.btnRemoveSelected_Click); + // + // btnOK + // + this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnOK.Location = new System.Drawing.Point(423, 385); + this.btnOK.Name = "btnOK"; + this.btnOK.Size = new System.Drawing.Size(75, 23); + this.btnOK.TabIndex = 14; + this.btnOK.Text = "Create"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // btnCancel + // + this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnCancel.Location = new System.Drawing.Point(504, 385); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(75, 23); + this.btnCancel.TabIndex = 15; + this.btnCancel.Text = "Cancel"; + this.btnCancel.UseVisualStyleBackColor = true; + this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); + // + // WizardForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(592, 420); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.btnOK); + this.Controls.Add(this.btnRemoveSelected); + this.Controls.Add(this.lstProjects); + this.Controls.Add(this.btnAddProject); + this.Controls.Add(this.clbRuntimes); + this.Controls.Add(this.lblRuntimes); + this.Controls.Add(this.txtProjectPrefix); + this.Controls.Add(this.lblProjectPrefix); + this.Controls.Add(this.cboProjectType); + this.Controls.Add(this.lblProjectType); + this.Controls.Add(this.lblAddProjects); + this.Controls.Add(this.lblHint); + this.Controls.Add(this.txtExtensionNamespace); + this.Controls.Add(this.lblExtensionNamespace); + this.Controls.Add(this.lblTitle); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "WizardForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Matrix42 Extension Solution Wizard"; + this.Load += new System.EventHandler(this.WizardForm_Load); + this.ResumeLayout(false); + this.PerformLayout(); + } + } +} diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Wizard/WizardForm.cs b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Wizard/WizardForm.cs new file mode 100644 index 0000000..4072727 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/Wizard/WizardForm.cs @@ -0,0 +1,164 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace Matrix42.Extensions.Scaffolder.Wizard +{ + public partial class WizardForm : Form + { + private readonly List _projects = new List(); + + public string ExtensionNamespace => txtExtensionNamespace.Text.Trim(); + public IReadOnlyList Projects => _projects; + + public WizardForm() + { + InitializeComponent(); + + cboProjectType.DataSource = Enum.GetValues(typeof(ProjectType)); + + clbRuntimes.Items.Add("Win"); + clbRuntimes.Items.Add("WinCore"); + clbRuntimes.Items.Add("LinuxCore"); + clbRuntimes.Items.Add("ALL"); + + cboProjectType.SelectedIndexChanged += CboProjectType_SelectedIndexChanged; + } + + private void WizardForm_Load(object sender, EventArgs e) + { + lblHint.Text = "aka Matrix42.MyExtension"; + } + + private void CboProjectType_SelectedIndexChanged(object sender, EventArgs e) + { + var type = (ProjectType)cboProjectType.SelectedItem; + switch (type) + { + case ProjectType.WebApi: + txtProjectPrefix.Text = "Services"; + txtProjectPrefix.ReadOnly = false; + break; + case ProjectType.Contracts: + txtProjectPrefix.Text = "Contracts"; + txtProjectPrefix.ReadOnly = false; + break; + case ProjectType.BizLogic: + txtProjectPrefix.Text = "BizLogic"; + txtProjectPrefix.ReadOnly = false; + break; + case ProjectType.Custom: + txtProjectPrefix.Text = string.Empty; + txtProjectPrefix.ReadOnly = false; + break; + } + } + + private void btnAddProject_Click(object sender, EventArgs e) + { + if (!ValidateProjectInputs()) + return; + + var def = new ProjectDefinition + { + Type = (ProjectType)cboProjectType.SelectedItem, + Prefix = txtProjectPrefix.Text.Trim(), + Runtimes = GetSelectedRuntimes() + }; + + _projects.Add(def); + lstProjects.Items.Add(def.Display); + + txtProjectPrefix.Clear(); + for (int i = 0; i < clbRuntimes.Items.Count; i++) + clbRuntimes.SetItemChecked(i, false); + } + + private RuntimeTargets GetSelectedRuntimes() + { + RuntimeTargets result = RuntimeTargets.None; + + foreach (var item in clbRuntimes.CheckedItems) + { + switch (item.ToString()) + { + case "Win": + result |= RuntimeTargets.Win; + break; + case "WinCore": + result |= RuntimeTargets.WinCore; + break; + case "LinuxCore": + result |= RuntimeTargets.LinuxCore; + break; + case "ALL": + result |= RuntimeTargets.All; + break; + } + } + + return result; + } + + private bool ValidateProjectInputs() + { + if (cboProjectType.SelectedItem == null) + { + MessageBox.Show("Please select project type."); + return false; + } + + var type = (ProjectType)cboProjectType.SelectedItem; + if (string.IsNullOrWhiteSpace(txtProjectPrefix.Text)) + { + if (type == ProjectType.Custom) + { + MessageBox.Show("Project prefix is required for Custom project type."); + return false; + } + } + + if (clbRuntimes.CheckedItems.Count == 0) + { + MessageBox.Show("Please select at least one runtime."); + return false; + } + + return true; + } + + private void btnRemoveSelected_Click(object sender, EventArgs e) + { + int idx = lstProjects.SelectedIndex; + if (idx < 0 || idx >= _projects.Count) + return; + + _projects.RemoveAt(idx); + lstProjects.Items.RemoveAt(idx); + } + + private void btnOK_Click(object sender, EventArgs e) + { + if (string.IsNullOrWhiteSpace(ExtensionNamespace)) + { + MessageBox.Show("Extension Namespace is required."); + return; + } + + if (_projects.Count == 0) + { + MessageBox.Show("Please add at least one project."); + return; + } + + DialogResult = DialogResult.OK; + Close(); + } + + private void btnCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/source.extension.vsixmanifest b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/source.extension.vsixmanifest new file mode 100644 index 0000000..4a548ca --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.Vsix/source.extension.vsixmanifest @@ -0,0 +1,22 @@ + + + + + Matrix42.Extensions.Scaffolder.Vsix + Creates a new Matrix42 extension solution with multiple projects based on Matrix42.Extensions.SDK. + + + + amd64 + + + + + + + + + + + + diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.sln b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.sln new file mode 100644 index 0000000..cc65c37 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/Solutions/Matrix42.Extensions.Scaffolder.sln @@ -0,0 +1,37 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36310.24 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Matrix42.Extensions.Scaffolder.Core", "Matrix42.Extensions.Scaffolder.Core\Matrix42.Extensions.Scaffolder.Core.csproj", "{43E82070-2941-4589-8BF5-1FD1D427BDAE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Matrix42.Extensions.Scaffolder.Console", "Matrix42.Extensions.Scaffolder.Console\Matrix42.Extensions.Scaffolder.Console.csproj", "{F7979A70-0D89-46B7-814C-1E7D0B0DF441}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Matrix42.Extensions.Scaffolder.Vsix", "Matrix42.Extensions.Scaffolder.Vsix\Matrix42.Extensions.Scaffolder.Vsix.csproj", "{50F8DCAA-48B9-47D5-ABB8-F8D33BEF1BD1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {43E82070-2941-4589-8BF5-1FD1D427BDAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {43E82070-2941-4589-8BF5-1FD1D427BDAE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {43E82070-2941-4589-8BF5-1FD1D427BDAE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {43E82070-2941-4589-8BF5-1FD1D427BDAE}.Release|Any CPU.Build.0 = Release|Any CPU + {F7979A70-0D89-46B7-814C-1E7D0B0DF441}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F7979A70-0D89-46B7-814C-1E7D0B0DF441}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F7979A70-0D89-46B7-814C-1E7D0B0DF441}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F7979A70-0D89-46B7-814C-1E7D0B0DF441}.Release|Any CPU.Build.0 = Release|Any CPU + {50F8DCAA-48B9-47D5-ABB8-F8D33BEF1BD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {50F8DCAA-48B9-47D5-ABB8-F8D33BEF1BD1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {50F8DCAA-48B9-47D5-ABB8-F8D33BEF1BD1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {50F8DCAA-48B9-47D5-ABB8-F8D33BEF1BD1}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {3329054A-94A3-4953-8650-68C9B450515A} + EndGlobalSection +EndGlobal diff --git a/F4SDM42WebApi/M42ExtensionScaffolder/service-info.yml b/F4SDM42WebApi/M42ExtensionScaffolder/service-info.yml new file mode 100644 index 0000000..3590171 --- /dev/null +++ b/F4SDM42WebApi/M42ExtensionScaffolder/service-info.yml @@ -0,0 +1,17 @@ +product: "M42 Enterprise" # The project or platform this service belongs to +service_name: "Extensions Scaffolder" # Name of the service +description: "Template project acting as an extension scaffolder. Automatically generate extension structure including provided projects and runtimes" # A brief description of the service + +owner: + name: "Titan" # Owner of the service (could be an individual or team) + email: "dmytro.romanii@matrix42.com" # Contact email for the owner + +pipelines: + pull_request_pipeline: "N/A" # URL to the pipeline that runs for pull requests + ci_pipeline: "N/A" # URL to the continuous integration (CI) pipeline + cd_pipeline: "N/A" # URL to the continuous delivery (CD) pipeline + +links: + repository: "https://dev.azure.com/matrix42/DWP/_git/M42ExtensionScaffolder" + documentation: "https://dev.azure.com/matrix42/DWP/_git/M42ExtensionScaffolder?path=/README.md" + backlog: "https://dev.azure.com/matrix42/BPM/_backlogs/backlog/Titan" diff --git a/F4SDM42WebApi/M42Libraries/26.1/AdminUI.AppManFoundation.dll b/F4SDM42WebApi/M42Libraries/26.1/AdminUI.AppManFoundation.dll new file mode 100644 index 0000000..932fb8c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/AdminUI.AppManFoundation.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/AdminUI.DcmObjectWrapper.dll b/F4SDM42WebApi/M42Libraries/26.1/AdminUI.DcmObjectWrapper.dll new file mode 100644 index 0000000..149ae2d Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/AdminUI.DcmObjectWrapper.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/AdminUI.WqlQueryEngine.dll b/F4SDM42WebApi/M42Libraries/26.1/AdminUI.WqlQueryEngine.dll new file mode 100644 index 0000000..ba493ee Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/AdminUI.WqlQueryEngine.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Ajax.dll b/F4SDM42WebApi/M42Libraries/26.1/Ajax.dll new file mode 100644 index 0000000..cfd96f8 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Ajax.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/AjaxControlToolkit.dll b/F4SDM42WebApi/M42Libraries/26.1/AjaxControlToolkit.dll new file mode 100644 index 0000000..01c3441 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/AjaxControlToolkit.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/AngleSharp.dll b/F4SDM42WebApi/M42Libraries/26.1/AngleSharp.dll new file mode 100644 index 0000000..89ceb20 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/AngleSharp.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/AntiXSSLibrary.dll b/F4SDM42WebApi/M42Libraries/26.1/AntiXSSLibrary.dll new file mode 100644 index 0000000..cfbd921 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/AntiXSSLibrary.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/AutoMapper.dll b/F4SDM42WebApi/M42Libraries/26.1/AutoMapper.dll new file mode 100644 index 0000000..d8bab71 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/AutoMapper.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Azure.Core.dll b/F4SDM42WebApi/M42Libraries/26.1/Azure.Core.dll new file mode 100644 index 0000000..b66ad00 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Azure.Core.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Azure.Identity.dll b/F4SDM42WebApi/M42Libraries/26.1/Azure.Identity.dll new file mode 100644 index 0000000..aab6832 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Azure.Identity.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/BouncyCastle.Crypto.dll b/F4SDM42WebApi/M42Libraries/26.1/BouncyCastle.Crypto.dll new file mode 100644 index 0000000..b811138 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/BouncyCastle.Crypto.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/CUSTLM42.ChangeObjectValue.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/CUSTLM42.ChangeObjectValue.BizLogic.dll new file mode 100644 index 0000000..4687c0a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/CUSTLM42.ChangeObjectValue.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/CUSTLM42.ChangeObjectValue.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/CUSTLM42.ChangeObjectValue.Contracts.dll new file mode 100644 index 0000000..9205271 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/CUSTLM42.ChangeObjectValue.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/CUSTLM42.ChangeObjectValue.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/CUSTLM42.ChangeObjectValue.Services.dll new file mode 100644 index 0000000..da266e5 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/CUSTLM42.ChangeObjectValue.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/CsvHelper.dll b/F4SDM42WebApi/M42Libraries/26.1/CsvHelper.dll new file mode 100644 index 0000000..0eb7084 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/CsvHelper.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/DcmObjectModel.dll b/F4SDM42WebApi/M42Libraries/26.1/DcmObjectModel.dll new file mode 100644 index 0000000..a559818 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/DcmObjectModel.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/EPPlus.dll b/F4SDM42WebApi/M42Libraries/26.1/EPPlus.dll new file mode 100644 index 0000000..49bbc56 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/EPPlus.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/EntityFramework.SqlServer.dll b/F4SDM42WebApi/M42Libraries/26.1/EntityFramework.SqlServer.dll new file mode 100644 index 0000000..063825a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/EntityFramework.SqlServer.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/EntityFramework.dll b/F4SDM42WebApi/M42Libraries/26.1/EntityFramework.dll new file mode 100644 index 0000000..befca81 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/EntityFramework.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Google.Apis.Auth.PlatformServices.dll b/F4SDM42WebApi/M42Libraries/26.1/Google.Apis.Auth.PlatformServices.dll new file mode 100644 index 0000000..f2d867c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Google.Apis.Auth.PlatformServices.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Google.Apis.Auth.dll b/F4SDM42WebApi/M42Libraries/26.1/Google.Apis.Auth.dll new file mode 100644 index 0000000..bc3057f Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Google.Apis.Auth.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Google.Apis.Core.dll b/F4SDM42WebApi/M42Libraries/26.1/Google.Apis.Core.dll new file mode 100644 index 0000000..9657cf3 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Google.Apis.Core.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Google.Apis.Gmail.v1.dll b/F4SDM42WebApi/M42Libraries/26.1/Google.Apis.Gmail.v1.dll new file mode 100644 index 0000000..54ab355 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Google.Apis.Gmail.v1.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Google.Apis.PlatformServices.dll b/F4SDM42WebApi/M42Libraries/26.1/Google.Apis.PlatformServices.dll new file mode 100644 index 0000000..c424ed5 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Google.Apis.PlatformServices.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Google.Apis.dll b/F4SDM42WebApi/M42Libraries/26.1/Google.Apis.dll new file mode 100644 index 0000000..15576a1 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Google.Apis.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/HtmlAgilityPack.dll b/F4SDM42WebApi/M42Libraries/26.1/HtmlAgilityPack.dll new file mode 100644 index 0000000..46ca135 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/HtmlAgilityPack.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/ICSharpCode.SharpZipLib.dll b/F4SDM42WebApi/M42Libraries/26.1/ICSharpCode.SharpZipLib.dll new file mode 100644 index 0000000..1048fcd Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/ICSharpCode.SharpZipLib.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Interop.ActiveDs.dll b/F4SDM42WebApi/M42Libraries/26.1/Interop.ActiveDs.dll new file mode 100644 index 0000000..4b81f2d Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Interop.ActiveDs.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Interop.DTS.dll b/F4SDM42WebApi/M42Libraries/26.1/Interop.DTS.dll new file mode 100644 index 0000000..543bfb3 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Interop.DTS.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Interop.WindowsInstaller.dll b/F4SDM42WebApi/M42Libraries/26.1/Interop.WindowsInstaller.dll new file mode 100644 index 0000000..e3fa40b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Interop.WindowsInstaller.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Ionic.Zip.dll b/F4SDM42WebApi/M42Libraries/26.1/Ionic.Zip.dll new file mode 100644 index 0000000..95fa928 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Ionic.Zip.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/MailBee.NET.dll b/F4SDM42WebApi/M42Libraries/26.1/MailBee.NET.dll new file mode 100644 index 0000000..b4387f2 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/MailBee.NET.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/MailKit.dll b/F4SDM42WebApi/M42Libraries/26.1/MailKit.dll new file mode 100644 index 0000000..4a72315 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/MailKit.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.AI.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.AI.Contracts.dll new file mode 100644 index 0000000..4910baa Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.AI.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Administration.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Administration.BizLogic.dll new file mode 100644 index 0000000..3c44eb3 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Administration.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Administration.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Administration.Common.dll new file mode 100644 index 0000000..412701a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Administration.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Administration.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Administration.Contracts.dll new file mode 100644 index 0000000..ee73079 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Administration.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Api.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Api.Contracts.dll new file mode 100644 index 0000000..3885343 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Api.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Api.DbClient.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Api.DbClient.dll new file mode 100644 index 0000000..3e026fa Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Api.DbClient.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.AssetManager.Activities.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.AssetManager.Activities.dll new file mode 100644 index 0000000..59c4383 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.AssetManager.Activities.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.AssetManager.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.AssetManager.BizLogic.dll new file mode 100644 index 0000000..a0c02e6 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.AssetManager.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.AssetManager.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.AssetManager.Services.dll new file mode 100644 index 0000000..b3a6adc Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.AssetManager.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Auth.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Auth.BizLogic.dll new file mode 100644 index 0000000..55fda66 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Auth.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Auth.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Auth.Contracts.dll new file mode 100644 index 0000000..eeaeb3c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Auth.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Auth.Engines.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Auth.Engines.dll new file mode 100644 index 0000000..3fd6551 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Auth.Engines.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Auth.STS.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Auth.STS.dll new file mode 100644 index 0000000..9750d94 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Auth.STS.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Auth.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Auth.Services.dll new file mode 100644 index 0000000..10fa0b8 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Auth.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.AzureAssetsDataProvider.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.AzureAssetsDataProvider.Services.dll new file mode 100644 index 0000000..0b32472 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.AzureAssetsDataProvider.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Behaviors.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Behaviors.Contracts.dll new file mode 100644 index 0000000..5a9527f Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Behaviors.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.BizLogic.Client.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.BizLogic.Client.dll new file mode 100644 index 0000000..8a0cb23 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.BizLogic.Client.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.BizLogic.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.BizLogic.Common.dll new file mode 100644 index 0000000..9598b3a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.BizLogic.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.BizLogic.Journal.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.BizLogic.Journal.dll new file mode 100644 index 0000000..e3306cf Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.BizLogic.Journal.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Blob.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Blob.BizLogic.dll new file mode 100644 index 0000000..8d1970a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Blob.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Blob.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Blob.Contracts.dll new file mode 100644 index 0000000..bcd6b77 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Blob.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUST.BpmnWorkflowIntegration.BizLayer.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUST.BpmnWorkflowIntegration.BizLayer.dll new file mode 100644 index 0000000..fbb8ffe Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUST.BpmnWorkflowIntegration.BizLayer.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUST.BpmnWorkflowIntegration.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUST.BpmnWorkflowIntegration.Contracts.dll new file mode 100644 index 0000000..08db2c6 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUST.BpmnWorkflowIntegration.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUST.BpmnWorkflowIntegration.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUST.BpmnWorkflowIntegration.Services.dll new file mode 100644 index 0000000..d8d1d2b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUST.BpmnWorkflowIntegration.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTCascDel.Core.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTCascDel.Core.dll new file mode 100644 index 0000000..280349b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTCascDel.Core.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTSchemaTransfer.Core.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTSchemaTransfer.Core.dll new file mode 100644 index 0000000..63a9b7f Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTSchemaTransfer.Core.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.BarcodeLib.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.BarcodeLib.dll new file mode 100644 index 0000000..b9142fb Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.BarcodeLib.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.Core.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.Core.dll new file mode 100644 index 0000000..a53c584 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.Core.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.DbLogging.WM.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.DbLogging.WM.dll new file mode 100644 index 0000000..68fb2db Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.DbLogging.WM.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.DbLogging.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.DbLogging.dll new file mode 100644 index 0000000..62162d5 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.DbLogging.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.DbLoggingArchiver.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.DbLoggingArchiver.dll new file mode 100644 index 0000000..9132452 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.DbLoggingArchiver.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.DbLoggingDataLayer.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.DbLoggingDataLayer.dll new file mode 100644 index 0000000..f575b3f Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.DbLoggingDataLayer.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.GeoLocWeb.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.GeoLocWeb.dll new file mode 100644 index 0000000..0bcc4ed Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.GeoLocWeb.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.MI.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.MI.dll new file mode 100644 index 0000000..2d90bb6 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.MI.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.ModelScript.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.ModelScript.dll new file mode 100644 index 0000000..61f7599 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.ModelScript.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.SgiWin.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.SgiWin.dll new file mode 100644 index 0000000..aa2928b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.SgiWin.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.Transfer.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.Transfer.dll new file mode 100644 index 0000000..1a0a44b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.Transfer.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.WM.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.WM.dll new file mode 100644 index 0000000..caec65f Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.WM.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.Web.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.Web.dll new file mode 100644 index 0000000..e25f119 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.Web.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.WinForms.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.WinForms.dll new file mode 100644 index 0000000..9a62a74 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CUSTUtility.WinForms.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Certificates.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Certificates.BizLogic.dll new file mode 100644 index 0000000..489a2b8 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Certificates.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Certificates.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Certificates.Contracts.dll new file mode 100644 index 0000000..76c221c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Certificates.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Certificates.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Certificates.Services.dll new file mode 100644 index 0000000..9dca193 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Certificates.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Clients.Mail.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Clients.Mail.Contracts.dll new file mode 100644 index 0000000..f63c790 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Clients.Mail.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Clients.Mail.Persistence.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Clients.Mail.Persistence.Contracts.dll new file mode 100644 index 0000000..8702c19 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Clients.Mail.Persistence.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Clients.Mail.Persistence.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Clients.Mail.Persistence.dll new file mode 100644 index 0000000..f282aa3 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Clients.Mail.Persistence.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Clients.Mail.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Clients.Mail.dll new file mode 100644 index 0000000..43c35f3 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Clients.Mail.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CloudCosts.Activities.Design.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CloudCosts.Activities.Design.dll new file mode 100644 index 0000000..d213c1f Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CloudCosts.Activities.Design.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CloudCosts.Activities.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CloudCosts.Activities.dll new file mode 100644 index 0000000..e0b0e10 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CloudCosts.Activities.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CloudCosts.Services.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CloudCosts.Services.Contracts.dll new file mode 100644 index 0000000..2189ba8 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CloudCosts.Services.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CloudCosts.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CloudCosts.Services.dll new file mode 100644 index 0000000..b38a822 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CloudCosts.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Common.Drawing.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Common.Drawing.dll new file mode 100644 index 0000000..a310eae Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Common.Drawing.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Common.Html.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Common.Html.dll new file mode 100644 index 0000000..ef62f03 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Common.Html.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Common.Implementation.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Common.Implementation.dll new file mode 100644 index 0000000..45a4092 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Common.Implementation.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Common.dll new file mode 100644 index 0000000..9d64639 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CommonDbRecords.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CommonDbRecords.Contracts.dll new file mode 100644 index 0000000..b43be5d Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.CommonDbRecords.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Compliance.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Compliance.BizLogic.dll new file mode 100644 index 0000000..5704e4a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Compliance.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Compliance.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Compliance.Common.dll new file mode 100644 index 0000000..c55c81d Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Compliance.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Compliance.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Compliance.Contracts.dll new file mode 100644 index 0000000..c59950e Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Compliance.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Compliance.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Compliance.Services.dll new file mode 100644 index 0000000..e731486 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Compliance.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Compliance.Workflow.Activities.Design.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Compliance.Workflow.Activities.Design.dll new file mode 100644 index 0000000..b022e45 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Compliance.Workflow.Activities.Design.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Compliance.Workflow.Activities.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Compliance.Workflow.Activities.dll new file mode 100644 index 0000000..c5aef0e Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Compliance.Workflow.Activities.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceReconciliation.Activities.Design.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceReconciliation.Activities.Design.dll new file mode 100644 index 0000000..07adbe1 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceReconciliation.Activities.Design.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceReconciliation.Activities.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceReconciliation.Activities.dll new file mode 100644 index 0000000..f4ebbbe Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceReconciliation.Activities.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceReconciliation.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceReconciliation.BizLogic.dll new file mode 100644 index 0000000..3394ad9 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceReconciliation.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceReconciliation.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceReconciliation.Common.dll new file mode 100644 index 0000000..a81dae2 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceReconciliation.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceReconciliation.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceReconciliation.Contracts.dll new file mode 100644 index 0000000..5efc5b3 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceReconciliation.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceRules.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceRules.BizLogic.dll new file mode 100644 index 0000000..746c4c3 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceRules.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceRules.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceRules.Contracts.dll new file mode 100644 index 0000000..5c1ff6a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceRules.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceRules.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceRules.Services.dll new file mode 100644 index 0000000..3956f25 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ComplianceRules.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ConfigurableAI.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ConfigurableAI.BizLogic.dll new file mode 100644 index 0000000..87c59f0 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ConfigurableAI.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ConfigurableAI.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ConfigurableAI.Contracts.dll new file mode 100644 index 0000000..6d54d39 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ConfigurableAI.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ConfigurableAI.OpenAIClient.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ConfigurableAI.OpenAIClient.dll new file mode 100644 index 0000000..7663439 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ConfigurableAI.OpenAIClient.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ConfigurableAI.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ConfigurableAI.Services.dll new file mode 100644 index 0000000..d046a5f Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ConfigurableAI.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ConfigurableAI.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ConfigurableAI.dll new file mode 100644 index 0000000..6d499bb Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ConfigurableAI.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Configuration.Global.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Configuration.Global.dll new file mode 100644 index 0000000..1dcf7a9 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Configuration.Global.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Configuration.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Configuration.dll new file mode 100644 index 0000000..54f2c36 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Configuration.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Activities.Design.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Activities.Design.dll new file mode 100644 index 0000000..bc628dc Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Activities.Design.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Activities.VmWare.Design.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Activities.VmWare.Design.dll new file mode 100644 index 0000000..4242034 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Activities.VmWare.Design.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Activities.VmWare.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Activities.VmWare.dll new file mode 100644 index 0000000..9e70670 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Activities.VmWare.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Activities.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Activities.dll new file mode 100644 index 0000000..04e04c1 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Activities.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.AzureActiveDirectory.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.AzureActiveDirectory.dll new file mode 100644 index 0000000..04663d8 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.AzureActiveDirectory.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.BizLogic.Client.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.BizLogic.Client.dll new file mode 100644 index 0000000..1ce0e57 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.BizLogic.Client.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.BizLogic.dll new file mode 100644 index 0000000..d71e4e3 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Client.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Client.dll new file mode 100644 index 0000000..773b8ef Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Client.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Common.dll new file mode 100644 index 0000000..fda6f78 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.AAD.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.AAD.dll new file mode 100644 index 0000000..dee7ecc Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.AAD.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.AirWatch.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.AirWatch.dll new file mode 100644 index 0000000..0132fcf Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.AirWatch.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.CloudCosts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.CloudCosts.dll new file mode 100644 index 0000000..93d9caa Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.CloudCosts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.Empirum.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.Empirum.dll new file mode 100644 index 0000000..a315a69 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.Empirum.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.EnterpriseManager.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.EnterpriseManager.dll new file mode 100644 index 0000000..51ea7ca Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.EnterpriseManager.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.Ldap.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.Ldap.dll new file mode 100644 index 0000000..f2949d4 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.Ldap.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.SCCM.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.SCCM.dll new file mode 100644 index 0000000..645c215 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.SCCM.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.Silverback.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.Silverback.dll new file mode 100644 index 0000000..20d3c1f Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Diagnostics.Silverback.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.EmSccm.Client.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.EmSccm.Client.dll new file mode 100644 index 0000000..d5de1ec Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.EmSccm.Client.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.EmSccm.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.EmSccm.dll new file mode 100644 index 0000000..702c7fd Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.EmSccm.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Intune.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Intune.dll new file mode 100644 index 0000000..1d4bbe7 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Intune.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Ldap.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Ldap.dll new file mode 100644 index 0000000..bc401a2 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Connectors.Ldap.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ContractManager.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ContractManager.BizLogic.dll new file mode 100644 index 0000000..8c9bdf2 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ContractManager.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ContractManager.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ContractManager.Services.dll new file mode 100644 index 0000000..ad24fba Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ContractManager.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.AssetManagement.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.AssetManagement.dll new file mode 100644 index 0000000..deb4b85 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.AssetManagement.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.Common.dll new file mode 100644 index 0000000..22d5879 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.ContractManager.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.ContractManager.dll new file mode 100644 index 0000000..5579cce Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.ContractManager.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.GDIE.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.GDIE.dll new file mode 100644 index 0000000..50724b1 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.GDIE.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.Install.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.Install.dll new file mode 100644 index 0000000..adb7dcb Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.Install.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.LicenseManagement.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.LicenseManagement.dll new file mode 100644 index 0000000..7820744 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.LicenseManagement.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.MasterData.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.MasterData.dll new file mode 100644 index 0000000..cd80853 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.MasterData.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.Platform.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.Platform.dll new file mode 100644 index 0000000..c679da3 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.Platform.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.ServiceManagement.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.ServiceManagement.dll new file mode 100644 index 0000000..9927ae8 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Contracts.ServiceManagement.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DWP.Workflows.Activities.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DWP.Workflows.Activities.dll new file mode 100644 index 0000000..5f91165 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DWP.Workflows.Activities.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DWP.Workflows.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DWP.Workflows.BizLogic.dll new file mode 100644 index 0000000..a9596f6 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DWP.Workflows.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DWP.Workflows.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DWP.Workflows.Contracts.dll new file mode 100644 index 0000000..7d23a0c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DWP.Workflows.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DWP.Workflows.Persistence.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DWP.Workflows.Persistence.dll new file mode 100644 index 0000000..26daf49 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DWP.Workflows.Persistence.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DWP.Workflows.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DWP.Workflows.Services.dll new file mode 100644 index 0000000..a177f14 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DWP.Workflows.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Data.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Data.Services.dll new file mode 100644 index 0000000..0882881 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Data.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataCenter.Activities.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataCenter.Activities.dll new file mode 100644 index 0000000..52fd00b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataCenter.Activities.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataGateway.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataGateway.Common.dll new file mode 100644 index 0000000..e290a2c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataGateway.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataGateway.Hosting.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataGateway.Hosting.dll new file mode 100644 index 0000000..abaeb37 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataGateway.Hosting.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataLayer.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataLayer.Common.dll new file mode 100644 index 0000000..7acdc85 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataLayer.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataLayer.Persistence.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataLayer.Persistence.Services.dll new file mode 100644 index 0000000..895ac92 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataLayer.Persistence.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataLayer.Persistence.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataLayer.Persistence.dll new file mode 100644 index 0000000..5f82c41 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataLayer.Persistence.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataProcessing.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataProcessing.Contracts.dll new file mode 100644 index 0000000..3b5eab0 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataProcessing.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataProcessing.Core.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataProcessing.Core.dll new file mode 100644 index 0000000..3b716c0 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataProcessing.Core.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataProvider.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataProvider.Contracts.dll new file mode 100644 index 0000000..9482835 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.DataProvider.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Distributed.Redis.Cache.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Distributed.Redis.Cache.dll new file mode 100644 index 0000000..13d3c7b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Distributed.Redis.Cache.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EM.Contract.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EM.Contract.dll new file mode 100644 index 0000000..e3ec8d2 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EM.Contract.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EM.Sdk.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EM.Sdk.dll new file mode 100644 index 0000000..decc6d2 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EM.Sdk.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Email.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Email.BizLogic.dll new file mode 100644 index 0000000..8619d53 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Email.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Email.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Email.Contracts.dll new file mode 100644 index 0000000..faa023a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Email.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Email.Service.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Email.Service.dll new file mode 100644 index 0000000..291643e Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Email.Service.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmailEngine.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmailEngine.BizLogic.dll new file mode 100644 index 0000000..2d28d69 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmailEngine.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmailEngine.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmailEngine.Common.dll new file mode 100644 index 0000000..68191ca Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmailEngine.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmailEngine.Persistence.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmailEngine.Persistence.Contracts.dll new file mode 100644 index 0000000..a29b00e Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmailEngine.Persistence.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmailEngine.Persistence.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmailEngine.Persistence.dll new file mode 100644 index 0000000..84bc1ee Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmailEngine.Persistence.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Empirum.Activities.Design.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Empirum.Activities.Design.dll new file mode 100644 index 0000000..c4f6392 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Empirum.Activities.Design.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Empirum.Activities.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Empirum.Activities.dll new file mode 100644 index 0000000..0c8a860 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Empirum.Activities.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumInventory.Activities.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumInventory.Activities.dll new file mode 100644 index 0000000..0958def Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumInventory.Activities.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumInventory.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumInventory.BizLogic.dll new file mode 100644 index 0000000..07364be Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumInventory.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumInventory.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumInventory.Contracts.dll new file mode 100644 index 0000000..869debe Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumInventory.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumInventory.Repositories.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumInventory.Repositories.dll new file mode 100644 index 0000000..65f23f2 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumInventory.Repositories.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumInventory.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumInventory.Services.dll new file mode 100644 index 0000000..193c865 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumInventory.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumServiceProvisioning.Activities.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumServiceProvisioning.Activities.dll new file mode 100644 index 0000000..62dd70b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumServiceProvisioning.Activities.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumServiceProvisioning.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumServiceProvisioning.BizLogic.dll new file mode 100644 index 0000000..80d537e Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumServiceProvisioning.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumServiceProvisioning.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumServiceProvisioning.Contracts.dll new file mode 100644 index 0000000..7c107d5 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EmpirumServiceProvisioning.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Engines.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Engines.BizLogic.dll new file mode 100644 index 0000000..14fde2d Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Engines.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Engines.Contracts.History.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Engines.Contracts.History.dll new file mode 100644 index 0000000..2fa57ac Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Engines.Contracts.History.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Engines.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Engines.Contracts.dll new file mode 100644 index 0000000..91bc87a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Engines.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Engines.DTOTransform.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Engines.DTOTransform.dll new file mode 100644 index 0000000..93c5ad8 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Engines.DTOTransform.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Engines.Persistence.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Engines.Persistence.dll new file mode 100644 index 0000000..91569e4 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Engines.Persistence.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Engines.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Engines.Services.dll new file mode 100644 index 0000000..6351576 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Engines.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Engines.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Engines.dll new file mode 100644 index 0000000..1d04555 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Engines.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.BizLogic.dll new file mode 100644 index 0000000..b0767e8 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Common.dll new file mode 100644 index 0000000..48efcc1 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Contracts.dll new file mode 100644 index 0000000..ffd8dfb Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Domain.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Domain.dll new file mode 100644 index 0000000..73767ab Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Domain.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Persistence.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Persistence.BizLogic.dll new file mode 100644 index 0000000..2b18e65 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Persistence.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Persistence.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Persistence.Contracts.dll new file mode 100644 index 0000000..79c622a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Persistence.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Persistence.Repositories.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Persistence.Repositories.dll new file mode 100644 index 0000000..5003031 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Persistence.Repositories.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Persistence.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Persistence.dll new file mode 100644 index 0000000..5b022b2 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Persistence.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Service.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Service.dll new file mode 100644 index 0000000..c7165b8 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.EnterpriseServiceBus.Service.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.BlackOw.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.BlackOw.BizLogic.dll new file mode 100644 index 0000000..3ad532a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.BlackOw.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.BlackOw.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.BlackOw.Contracts.dll new file mode 100644 index 0000000..344a4ee Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.BlackOw.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.BlackOw.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.BlackOw.Services.dll new file mode 100644 index 0000000..a10c931 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.BlackOw.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.WebRC.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.WebRC.BizLogic.dll new file mode 100644 index 0000000..becc4bd Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.WebRC.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.WebRC.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.WebRC.Contracts.dll new file mode 100644 index 0000000..61005ce Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.WebRC.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.WebRC.ESB.Models.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.WebRC.ESB.Models.dll new file mode 100644 index 0000000..f4637d4 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.WebRC.ESB.Models.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.WebRC.ESB.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.WebRC.ESB.dll new file mode 100644 index 0000000..594072b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.WebRC.ESB.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.WebRC.JWT.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.WebRC.JWT.dll new file mode 100644 index 0000000..625311c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.WebRC.JWT.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.WebRC.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.WebRC.Services.dll new file mode 100644 index 0000000..4c88713 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.WebRC.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.WebRC.Utils.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.WebRC.Utils.dll new file mode 100644 index 0000000..a921bba Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Esm.WebRC.Utils.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.FileStorage.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.FileStorage.BizLogic.dll new file mode 100644 index 0000000..aa00dd3 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.FileStorage.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.FileStorage.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.FileStorage.Contracts.dll new file mode 100644 index 0000000..7570864 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.FileStorage.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.FileStorage.Persistence.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.FileStorage.Persistence.dll new file mode 100644 index 0000000..6020ba8 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.FileStorage.Persistence.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.FileStorage.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.FileStorage.Services.dll new file mode 100644 index 0000000..0c90a94 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.FileStorage.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.FunctionEngine.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.FunctionEngine.Contracts.dll new file mode 100644 index 0000000..942470e Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.FunctionEngine.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.FunctionEngine.Executor.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.FunctionEngine.Executor.Contracts.dll new file mode 100644 index 0000000..d9355ca Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.FunctionEngine.Executor.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.FunctionEngine.TaskContext.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.FunctionEngine.TaskContext.dll new file mode 100644 index 0000000..41f8cf4 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.FunctionEngine.TaskContext.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.GDIE.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.GDIE.Services.dll new file mode 100644 index 0000000..0647fdf Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.GDIE.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.GenericInventoryProvider.Activities.Design.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.GenericInventoryProvider.Activities.Design.dll new file mode 100644 index 0000000..2148f60 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.GenericInventoryProvider.Activities.Design.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.GenericInventoryProvider.Activities.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.GenericInventoryProvider.Activities.dll new file mode 100644 index 0000000..866c1d8 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.GenericInventoryProvider.Activities.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.GenericInventoryProvider.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.GenericInventoryProvider.Contracts.dll new file mode 100644 index 0000000..3d35286 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.GenericInventoryProvider.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.History.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.History.Contracts.dll new file mode 100644 index 0000000..246500b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.History.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.HostScheduler.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.HostScheduler.Contracts.dll new file mode 100644 index 0000000..167769c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.HostScheduler.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.HostScheduler.Server.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.HostScheduler.Server.dll new file mode 100644 index 0000000..8d47243 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.HostScheduler.Server.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Hosting.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Hosting.Contracts.dll new file mode 100644 index 0000000..f464867 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Hosting.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Hosting.ServiceLocatorProxy.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Hosting.ServiceLocatorProxy.dll new file mode 100644 index 0000000..acc1d16 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Hosting.ServiceLocatorProxy.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Hosting.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Hosting.dll new file mode 100644 index 0000000..c2763d0 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Hosting.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Http.Client.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Http.Client.Contracts.dll new file mode 100644 index 0000000..10a39ee Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Http.Client.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Http.Client.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Http.Client.dll new file mode 100644 index 0000000..a6d240e Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Http.Client.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.IBM_LMT.Activities.Design.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.IBM_LMT.Activities.Design.dll new file mode 100644 index 0000000..53b35b0 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.IBM_LMT.Activities.Design.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.IBM_LMT.Activities.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.IBM_LMT.Activities.dll new file mode 100644 index 0000000..683caf0 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.IBM_LMT.Activities.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.IBM_LMT.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.IBM_LMT.Contracts.dll new file mode 100644 index 0000000..48dc93d Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.IBM_LMT.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.InfoUtils.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.InfoUtils.dll new file mode 100644 index 0000000..6776abc Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.InfoUtils.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Aurora.General.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Aurora.General.dll new file mode 100644 index 0000000..a70909d Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Aurora.General.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Aurora.Ingest.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Aurora.Ingest.BizLogic.dll new file mode 100644 index 0000000..a77dcd5 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Aurora.Ingest.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Aurora.Ingest.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Aurora.Ingest.Contracts.dll new file mode 100644 index 0000000..cd2080a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Aurora.Ingest.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Aurora.Search.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Aurora.Search.BizLogic.dll new file mode 100644 index 0000000..52afaad Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Aurora.Search.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Aurora.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Aurora.Services.dll new file mode 100644 index 0000000..4b2e85b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Aurora.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.BizLogic.dll new file mode 100644 index 0000000..0ce375f Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.DbChangeTracking.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.DbChangeTracking.BizLogic.dll new file mode 100644 index 0000000..952249e Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.DbChangeTracking.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.DbChangeTracking.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.DbChangeTracking.Contracts.dll new file mode 100644 index 0000000..d140e14 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.DbChangeTracking.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Proxy.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Proxy.BizLogic.dll new file mode 100644 index 0000000..4a3921e Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Proxy.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Proxy.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Proxy.Contracts.dll new file mode 100644 index 0000000..98e1cb9 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Proxy.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.ProxyServices.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.ProxyServices.dll new file mode 100644 index 0000000..674bf26 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.ProxyServices.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Search.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Search.Contracts.dll new file mode 100644 index 0000000..4eec7eb Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Search.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Services.dll new file mode 100644 index 0000000..b49ccf6 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Integration.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.IntuneIntegration.Activities.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.IntuneIntegration.Activities.dll new file mode 100644 index 0000000..1414d5d Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.IntuneIntegration.Activities.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.IntuneIntegration.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.IntuneIntegration.Contracts.dll new file mode 100644 index 0000000..23244fe Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.IntuneIntegration.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Inventory.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Inventory.BizLogic.dll new file mode 100644 index 0000000..9ca13c3 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Inventory.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Inventory.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Inventory.Contracts.dll new file mode 100644 index 0000000..4866b69 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Inventory.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.KnowledgeDiscoveryForEndUser.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.KnowledgeDiscoveryForEndUser.dll new file mode 100644 index 0000000..e2cd97d Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.KnowledgeDiscoveryForEndUser.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.LicenseManager.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.LicenseManager.BizLogic.dll new file mode 100644 index 0000000..8e3f09c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.LicenseManager.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.LicenseManager.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.LicenseManager.Services.dll new file mode 100644 index 0000000..7fe449a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.LicenseManager.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.LisUpdate.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.LisUpdate.BizLogic.dll new file mode 100644 index 0000000..540ad50 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.LisUpdate.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.LogSweeper.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.LogSweeper.dll new file mode 100644 index 0000000..b0de431 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.LogSweeper.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Logging.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Logging.Contracts.dll new file mode 100644 index 0000000..9255555 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Logging.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Logging.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Logging.dll new file mode 100644 index 0000000..510e898 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Logging.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MPL.CheckCertificateActivity.BizLayer.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MPL.CheckCertificateActivity.BizLayer.dll new file mode 100644 index 0000000..df03ec7 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MPL.CheckCertificateActivity.BizLayer.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MPL.Log.WM.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MPL.Log.WM.dll new file mode 100644 index 0000000..5bfae8d Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MPL.Log.WM.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MPLApps.CopyObjects.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MPLApps.CopyObjects.Services.dll new file mode 100644 index 0000000..f55e603 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MPLApps.CopyObjects.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MQDataAdapter.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MQDataAdapter.BizLogic.dll new file mode 100644 index 0000000..0db5836 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MQDataAdapter.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MQDataAdapter.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MQDataAdapter.Contracts.dll new file mode 100644 index 0000000..b98cff4 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MQDataAdapter.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MQDataAdapter.Domain.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MQDataAdapter.Domain.dll new file mode 100644 index 0000000..374cd1e Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MQDataAdapter.Domain.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MQDataAdapter.Engines.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MQDataAdapter.Engines.dll new file mode 100644 index 0000000..f55d072 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MQDataAdapter.Engines.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MQDataAdapter.Persistence.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MQDataAdapter.Persistence.dll new file mode 100644 index 0000000..5d8a9a8 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MQDataAdapter.Persistence.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Maintenance.Database.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Maintenance.Database.dll new file mode 100644 index 0000000..5db8b60 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Maintenance.Database.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ManagedStorageService.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ManagedStorageService.BizLogic.dll new file mode 100644 index 0000000..969e6ec Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ManagedStorageService.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ManagedStorageService.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ManagedStorageService.Common.dll new file mode 100644 index 0000000..6c27116 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ManagedStorageService.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ManagedStorageService.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ManagedStorageService.Contracts.dll new file mode 100644 index 0000000..1e26984 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ManagedStorageService.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ManagedStorageService.Repositories.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ManagedStorageService.Repositories.dll new file mode 100644 index 0000000..0752b90 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ManagedStorageService.Repositories.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ManagedStorageService.Service.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ManagedStorageService.Service.dll new file mode 100644 index 0000000..61464e5 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ManagedStorageService.Service.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MarvinAI.SVS.Customizing.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MarvinAI.SVS.Customizing.dll new file mode 100644 index 0000000..6e5082b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MarvinAI.SVS.Customizing.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MasterData.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MasterData.BizLogic.dll new file mode 100644 index 0000000..eeb5466 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MasterData.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MasterData.Persistence.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MasterData.Persistence.Contracts.dll new file mode 100644 index 0000000..99e1a27 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MasterData.Persistence.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MasterData.Persistence.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MasterData.Persistence.dll new file mode 100644 index 0000000..5f0db23 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MasterData.Persistence.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MasterData.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MasterData.Services.dll new file mode 100644 index 0000000..dda7b66 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MasterData.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MasterData.UserDistribution.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MasterData.UserDistribution.Contracts.dll new file mode 100644 index 0000000..62124ef Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MasterData.UserDistribution.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MessageQueuing.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MessageQueuing.dll new file mode 100644 index 0000000..5d4aa36 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MessageQueuing.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MobileManagement.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MobileManagement.BizLogic.dll new file mode 100644 index 0000000..502f7e9 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MobileManagement.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MsTeamsNotification.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MsTeamsNotification.BizLogic.dll new file mode 100644 index 0000000..5f97878 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MsTeamsNotification.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MsTeamsNotification.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MsTeamsNotification.Services.dll new file mode 100644 index 0000000..00597f4 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.MsTeamsNotification.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Oracle.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Oracle.Common.dll new file mode 100644 index 0000000..6efd799 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Oracle.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Oracle.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Oracle.Contracts.dll new file mode 100644 index 0000000..bebb438 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Oracle.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Oracle.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Oracle.Services.dll new file mode 100644 index 0000000..62f617c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Oracle.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.BizLogic.dll new file mode 100644 index 0000000..9fca0f9 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.Contracts.dll new file mode 100644 index 0000000..524ac74 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.FrontEnd.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.FrontEnd.BizLogic.dll new file mode 100644 index 0000000..1fc55e6 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.FrontEnd.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.FrontEnd.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.FrontEnd.Contracts.dll new file mode 100644 index 0000000..45804e1 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.FrontEnd.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.FrontEnd.Persistence.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.FrontEnd.Persistence.dll new file mode 100644 index 0000000..9c86be9 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.FrontEnd.Persistence.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.FrontEnd.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.FrontEnd.Services.dll new file mode 100644 index 0000000..ab75387 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.FrontEnd.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.Migration.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.Migration.dll new file mode 100644 index 0000000..c3ab251 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.Migration.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.Persistence.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.Persistence.Contracts.dll new file mode 100644 index 0000000..bf91522 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.Persistence.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.Persistence.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.Persistence.dll new file mode 100644 index 0000000..516eaef Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.Persistence.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.ServiceStore.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.ServiceStore.Contracts.dll new file mode 100644 index 0000000..8440aa5 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.ServiceStore.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.ServiceStore.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.ServiceStore.Services.dll new file mode 100644 index 0000000..f4627bf Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.ServiceStore.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.ServiceStore.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.ServiceStore.dll new file mode 100644 index 0000000..157df15 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.ServiceStore.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.Services.dll new file mode 100644 index 0000000..2c9716a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Pandora.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.PerformanceMonitoring.Server.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.PerformanceMonitoring.Server.dll new file mode 100644 index 0000000..682baa3 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.PerformanceMonitoring.Server.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Persistence.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Persistence.Common.dll new file mode 100644 index 0000000..74f43db Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Persistence.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Persistence.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Persistence.Contracts.dll new file mode 100644 index 0000000..2493bbb Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Persistence.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Persistence.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Persistence.dll new file mode 100644 index 0000000..28bb7b7 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Persistence.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Platform.Search.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Platform.Search.Contracts.dll new file mode 100644 index 0000000..ceef4d9 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Platform.Search.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Platform.Search.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Platform.Search.Services.dll new file mode 100644 index 0000000..85da608 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Platform.Search.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Portal.BizLogic.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Portal.BizLogic.Contracts.dll new file mode 100644 index 0000000..27778e7 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Portal.BizLogic.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Portal.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Portal.BizLogic.dll new file mode 100644 index 0000000..ac2ef20 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Portal.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Portal.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Portal.Services.dll new file mode 100644 index 0000000..9851e6a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Portal.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Powershell.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Powershell.Contracts.dll new file mode 100644 index 0000000..8717f83 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Powershell.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Powershell.Execution.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Powershell.Execution.dll new file mode 100644 index 0000000..1da3c80 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Powershell.Execution.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.PrivateCluster.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.PrivateCluster.BizLogic.dll new file mode 100644 index 0000000..1b04ccd Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.PrivateCluster.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.PrivateCluster.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.PrivateCluster.Contracts.dll new file mode 100644 index 0000000..617c241 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.PrivateCluster.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.PushNotification.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.PushNotification.BizLogic.dll new file mode 100644 index 0000000..fabcb13 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.PushNotification.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.PushNotification.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.PushNotification.Contracts.dll new file mode 100644 index 0000000..4c467d3 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.PushNotification.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Queue.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Queue.BizLogic.dll new file mode 100644 index 0000000..0584706 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Queue.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Queue.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Queue.Contracts.dll new file mode 100644 index 0000000..7c4dc27 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Queue.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Queue.Persistence.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Queue.Persistence.dll new file mode 100644 index 0000000..2a8f703 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Queue.Persistence.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Queue.Service.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Queue.Service.dll new file mode 100644 index 0000000..e2f178a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Queue.Service.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Queue.ServiceBus.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Queue.ServiceBus.Contracts.dll new file mode 100644 index 0000000..1393ffe Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Queue.ServiceBus.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Queue.ServiceBus.Sender.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Queue.ServiceBus.Sender.dll new file mode 100644 index 0000000..cb4b23a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Queue.ServiceBus.Sender.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.QueueProxy.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.QueueProxy.BizLogic.dll new file mode 100644 index 0000000..ac5fa33 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.QueueProxy.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.QueueProxy.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.QueueProxy.Contracts.dll new file mode 100644 index 0000000..10c8139 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.QueueProxy.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.QueueProxy.Service.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.QueueProxy.Service.dll new file mode 100644 index 0000000..f52c7b2 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.QueueProxy.Service.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ReportingServices.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ReportingServices.Services.dll new file mode 100644 index 0000000..0d62c07 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ReportingServices.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Reports.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Reports.Common.dll new file mode 100644 index 0000000..05f1125 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Reports.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Resources.Core.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Resources.Core.dll new file mode 100644 index 0000000..45632ae Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Resources.Core.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Resources.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Resources.dll new file mode 100644 index 0000000..86a6c8c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Resources.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Runtime.CompilerServices.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Runtime.CompilerServices.dll new file mode 100644 index 0000000..419f094 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Runtime.CompilerServices.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SCCM2007.Connector.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SCCM2007.Connector.dll new file mode 100644 index 0000000..07f759c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SCCM2007.Connector.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SCCM2012.Connector.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SCCM2012.Connector.dll new file mode 100644 index 0000000..8fcb101 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SCCM2012.Connector.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SDK.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SDK.Contracts.dll new file mode 100644 index 0000000..469d3eb Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SDK.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.STS.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.STS.dll new file mode 100644 index 0000000..c72724c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.STS.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Schema.Installer.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Schema.Installer.dll new file mode 100644 index 0000000..b1c8bea Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Schema.Installer.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SearchService.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SearchService.BizLogic.dll new file mode 100644 index 0000000..99d7e4a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SearchService.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SearchService.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SearchService.Contracts.dll new file mode 100644 index 0000000..aed9fbb Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SearchService.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServerCompliance.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServerCompliance.BizLogic.dll new file mode 100644 index 0000000..5fe8609 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServerCompliance.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceBus.Adapter.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceBus.Adapter.dll new file mode 100644 index 0000000..553f435 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceBus.Adapter.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceBus.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceBus.Contracts.dll new file mode 100644 index 0000000..cdafdee Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceBus.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceBus.MessageModel.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceBus.MessageModel.dll new file mode 100644 index 0000000..6d9e083 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceBus.MessageModel.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceCatalog.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceCatalog.Contracts.dll new file mode 100644 index 0000000..a7b82d5 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceCatalog.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceConnection.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceConnection.BizLogic.dll new file mode 100644 index 0000000..931920e Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceConnection.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceConnection.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceConnection.Contracts.dll new file mode 100644 index 0000000..1227283 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceConnection.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceConnection.Persistence.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceConnection.Persistence.Contracts.dll new file mode 100644 index 0000000..1672a27 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceConnection.Persistence.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceConnection.Persistence.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceConnection.Persistence.dll new file mode 100644 index 0000000..3b6ad76 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceConnection.Persistence.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceConnection.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceConnection.Services.dll new file mode 100644 index 0000000..1a3d191 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceConnection.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceManager.Activities.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceManager.Activities.dll new file mode 100644 index 0000000..ab9f9b2 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceManager.Activities.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceManager.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceManager.BizLogic.dll new file mode 100644 index 0000000..e8bc926 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceManager.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceManager.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceManager.Contracts.dll new file mode 100644 index 0000000..7f4f6ec Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceManager.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceManager.EmailRobot.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceManager.EmailRobot.dll new file mode 100644 index 0000000..a940a46 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceManager.EmailRobot.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceManager.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceManager.Services.dll new file mode 100644 index 0000000..b2e5dd1 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceManager.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceModel.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceModel.dll new file mode 100644 index 0000000..b6073a7 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceModel.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceRepository.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceRepository.BizLogic.dll new file mode 100644 index 0000000..6a2a109 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceRepository.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceRepository.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceRepository.Common.dll new file mode 100644 index 0000000..e910005 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceRepository.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceRepository.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceRepository.Contracts.dll new file mode 100644 index 0000000..bfc30e1 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceRepository.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceRepository.Controllers.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceRepository.Controllers.dll new file mode 100644 index 0000000..556a024 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceRepository.Controllers.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceRepository.Web.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceRepository.Web.dll new file mode 100644 index 0000000..e18dab6 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.ServiceRepository.Web.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Client.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Client.dll new file mode 100644 index 0000000..92a2a31 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Client.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Common.dll new file mode 100644 index 0000000..a965b60 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Description.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Description.Contracts.dll new file mode 100644 index 0000000..2b1bcea Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Description.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Description.Discovery.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Description.Discovery.dll new file mode 100644 index 0000000..cefee19 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Description.Discovery.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Description.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Description.dll new file mode 100644 index 0000000..7e3ae1a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Description.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.General.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.General.dll new file mode 100644 index 0000000..34c75f8 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.General.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Persistence.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Persistence.Contracts.dll new file mode 100644 index 0000000..c4179df Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Persistence.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Security.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Security.dll new file mode 100644 index 0000000..d79307b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Security.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.WebApi.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.WebApi.Common.dll new file mode 100644 index 0000000..b6eeae2 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.WebApi.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.WebApi.Configuration.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.WebApi.Configuration.dll new file mode 100644 index 0000000..604a2bb Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.WebApi.Configuration.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.WebApi.Security.Srv.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.WebApi.Security.Srv.dll new file mode 100644 index 0000000..ce3c3ea Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.WebApi.Security.Srv.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.WebApi.Security.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.WebApi.Security.dll new file mode 100644 index 0000000..14782fe Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.WebApi.Security.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.WebApi.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.WebApi.dll new file mode 100644 index 0000000..032bd84 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.WebApi.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Workflow.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Workflow.dll new file mode 100644 index 0000000..53e4899 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.Workflow.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.dll new file mode 100644 index 0000000..20777b5 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Setup.UpdateRules.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Setup.UpdateRules.Common.dll new file mode 100644 index 0000000..6c4dab3 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Setup.UpdateRules.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Setup.UpdateRules.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Setup.UpdateRules.dll new file mode 100644 index 0000000..d4cb57d Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Setup.UpdateRules.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Shell.Web.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Shell.Web.dll new file mode 100644 index 0000000..b2deaaf Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Shell.Web.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.StorageService.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.StorageService.BizLogic.dll new file mode 100644 index 0000000..29d7cd5 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.StorageService.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.StorageService.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.StorageService.Common.dll new file mode 100644 index 0000000..286333c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.StorageService.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.StorageService.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.StorageService.Contracts.dll new file mode 100644 index 0000000..4bbde36 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.StorageService.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.StorageService.Persistence.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.StorageService.Persistence.dll new file mode 100644 index 0000000..9572e27 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.StorageService.Persistence.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.StorageService.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.StorageService.Services.dll new file mode 100644 index 0000000..5b301c9 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.StorageService.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.BizLogic.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.BizLogic.Contracts.dll new file mode 100644 index 0000000..fbc11fc Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.BizLogic.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.BizLogic.dll new file mode 100644 index 0000000..e3c236c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.Contracts.dll new file mode 100644 index 0000000..192d5de Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.Persistence.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.Persistence.Contracts.dll new file mode 100644 index 0000000..28efdaa Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.Persistence.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.Persistence.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.Persistence.dll new file mode 100644 index 0000000..361769f Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.Persistence.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.Rules.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.Rules.dll new file mode 100644 index 0000000..c19d5da Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.Rules.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.Services.dll new file mode 100644 index 0000000..5a5c61a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.dll new file mode 100644 index 0000000..d133e2d Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.SystemDiagnostics.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Telemetry.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Telemetry.BizLogic.dll new file mode 100644 index 0000000..eac5b9d Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Telemetry.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Telemetry.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Telemetry.Contracts.dll new file mode 100644 index 0000000..ccdc72a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Telemetry.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.TokenCache.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.TokenCache.BizLogic.dll new file mode 100644 index 0000000..d590163 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.TokenCache.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.TokenCache.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.TokenCache.Contracts.dll new file mode 100644 index 0000000..cc5c660 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.TokenCache.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.Activities.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.Activities.dll new file mode 100644 index 0000000..ed67baf Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.Activities.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.BizLogic.dll new file mode 100644 index 0000000..42780b2 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.Common.dll new file mode 100644 index 0000000..b7ab7bc Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.Contracts.dll new file mode 100644 index 0000000..8cc3c50 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.Domain.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.Domain.dll new file mode 100644 index 0000000..f2848cc Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.Domain.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.ESB.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.ESB.dll new file mode 100644 index 0000000..8ab9c31 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.ESB.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.Persistence.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.Persistence.BizLogic.dll new file mode 100644 index 0000000..c8ac40f Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.Persistence.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.Repositories.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.Repositories.dll new file mode 100644 index 0000000..d277642 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.Repositories.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.Service.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.Service.dll new file mode 100644 index 0000000..f135f0a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.UEMConsole.Service.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Utility.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Utility.dll new file mode 100644 index 0000000..a32e932 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Utility.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.VirtualCompliance.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.VirtualCompliance.BizLogic.dll new file mode 100644 index 0000000..790e1a6 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.VirtualCompliance.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.VirtualCompliance.Client.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.VirtualCompliance.Client.Contracts.dll new file mode 100644 index 0000000..4987401 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.VirtualCompliance.Client.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.VirtualCompliance.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.VirtualCompliance.Common.dll new file mode 100644 index 0000000..7675eaf Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.VirtualCompliance.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.VirtualCompliance.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.VirtualCompliance.Contracts.dll new file mode 100644 index 0000000..57f5eff Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.VirtualCompliance.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.VirtualCompliance.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.VirtualCompliance.Services.dll new file mode 100644 index 0000000..93ed8bb Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.VirtualCompliance.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.VirtualInventory.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.VirtualInventory.BizLogic.dll new file mode 100644 index 0000000..96a72ee Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.VirtualInventory.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Virtualization.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Virtualization.Contracts.dll new file mode 100644 index 0000000..a1f9219 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Virtualization.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Web.AttachmentHandler.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Web.AttachmentHandler.dll new file mode 100644 index 0000000..73b910c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Web.AttachmentHandler.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Web.UI.Controls.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Web.UI.Controls.dll new file mode 100644 index 0000000..f2b2d5d Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Web.UI.Controls.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.WebApi.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.WebApi.Contracts.dll new file mode 100644 index 0000000..a063b5c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.WebApi.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.WebUUX.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.WebUUX.dll new file mode 100644 index 0000000..50989da Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.WebUUX.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.WorkProcess.Core.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.WorkProcess.Core.dll new file mode 100644 index 0000000..0e70690 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.WorkProcess.Core.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Worker.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Worker.BizLogic.dll new file mode 100644 index 0000000..a1afa01 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Worker.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Worker.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Worker.Contracts.dll new file mode 100644 index 0000000..f84a516 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Worker.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Worker.Persistence.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Worker.Persistence.dll new file mode 100644 index 0000000..70af36e Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Worker.Persistence.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Worker.Remoting.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Worker.Remoting.dll new file mode 100644 index 0000000..90b2f83 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Worker.Remoting.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Worker.Service.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Worker.Service.dll new file mode 100644 index 0000000..5d92b45 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Worker.Service.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Activities.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Activities.Common.dll new file mode 100644 index 0000000..175518d Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Activities.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Activities.Design.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Activities.Design.dll new file mode 100644 index 0000000..d173c40 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Activities.Design.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Activities.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Activities.dll new file mode 100644 index 0000000..9af041a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Activities.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.BizLogic.dll new file mode 100644 index 0000000..05ca4a6 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Contracts.dll new file mode 100644 index 0000000..039aff6 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Persistence.Sql.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Persistence.Sql.dll new file mode 100644 index 0000000..3b0c2b3 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Persistence.Sql.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Services.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Services.dll new file mode 100644 index 0000000..48d5560 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Services.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Worker.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Worker.BizLogic.dll new file mode 100644 index 0000000..55c974d Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Worker.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Worker.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Worker.Contracts.dll new file mode 100644 index 0000000..f9e9fdc Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Matrix42.Workflows.Worker.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Activities.Extensions.Design.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Activities.Extensions.Design.dll new file mode 100644 index 0000000..28b3f04 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Activities.Extensions.Design.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Activities.Extensions.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Activities.Extensions.dll new file mode 100644 index 0000000..992a50d Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Activities.Extensions.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.AnalysisServices.AdomdClient.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.AnalysisServices.AdomdClient.dll new file mode 100644 index 0000000..6dcfea0 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.AnalysisServices.AdomdClient.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.AspNet.SignalR.Core.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.AspNet.SignalR.Core.dll new file mode 100644 index 0000000..7077582 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.AspNet.SignalR.Core.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.AspNet.SignalR.Owin.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.AspNet.SignalR.Owin.dll new file mode 100644 index 0000000..a266b4c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.AspNet.SignalR.Owin.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.AspNet.SignalR.SqlServer.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.AspNet.SignalR.SqlServer.dll new file mode 100644 index 0000000..2815652 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.AspNet.SignalR.SqlServer.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.AspNet.SignalR.SystemWeb.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.AspNet.SignalR.SystemWeb.dll new file mode 100644 index 0000000..1c9a8a3 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.AspNet.SignalR.SystemWeb.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.AspNetCore.StaticFiles.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.AspNetCore.StaticFiles.dll new file mode 100644 index 0000000..6e249bb Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.AspNetCore.StaticFiles.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.AspNetCore.SystemWebAdapters.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.AspNetCore.SystemWebAdapters.dll new file mode 100644 index 0000000..84e3b39 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.AspNetCore.SystemWebAdapters.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Azure.Amqp.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Azure.Amqp.dll new file mode 100644 index 0000000..8411f98 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Azure.Amqp.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Azure.KeyVault.Core.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Azure.KeyVault.Core.dll new file mode 100644 index 0000000..58d9629 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Azure.KeyVault.Core.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Azure.ServiceBus.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Azure.ServiceBus.dll new file mode 100644 index 0000000..1e915bb Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Azure.ServiceBus.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Bcl.AsyncInterfaces.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Bcl.AsyncInterfaces.dll new file mode 100644 index 0000000..6031ba1 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Bcl.AsyncInterfaces.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Bcl.HashCode.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Bcl.HashCode.dll new file mode 100644 index 0000000..3f97f6e Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Bcl.HashCode.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.ConfigurationManagement.ApplicationManagement.WMInstaller.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.ConfigurationManagement.ApplicationManagement.WMInstaller.dll new file mode 100644 index 0000000..fde14fd Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.ConfigurationManagement.ApplicationManagement.WMInstaller.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.ConfigurationManagement.ApplicationManagement.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.ConfigurationManagement.ApplicationManagement.dll new file mode 100644 index 0000000..2ff6323 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.ConfigurationManagement.ApplicationManagement.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.ConfigurationManagement.ManagementProvider.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.ConfigurationManagement.ManagementProvider.dll new file mode 100644 index 0000000..076dd83 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.ConfigurationManagement.ManagementProvider.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.Activities.Design.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.Activities.Design.dll new file mode 100644 index 0000000..44dd2a7 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.Activities.Design.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.Activities.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.Activities.dll new file mode 100644 index 0000000..ebe571f Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.Activities.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.Edm.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.Edm.dll new file mode 100644 index 0000000..eec7173 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.Edm.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.OData.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.OData.dll new file mode 100644 index 0000000..1238938 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.OData.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.Services.Client.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.Services.Client.dll new file mode 100644 index 0000000..d779fc3 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.Services.Client.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.SqlClient.SNI.arm64.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.SqlClient.SNI.arm64.dll new file mode 100644 index 0000000..f45095e Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.SqlClient.SNI.arm64.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.SqlClient.SNI.x64.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.SqlClient.SNI.x64.dll new file mode 100644 index 0000000..12b8900 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.SqlClient.SNI.x64.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.SqlClient.SNI.x86.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.SqlClient.SNI.x86.dll new file mode 100644 index 0000000..ec5ec13 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.SqlClient.SNI.x86.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.SqlClient.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.SqlClient.dll new file mode 100644 index 0000000..213f552 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.SqlClient.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.Tools.Sql.BatchParser.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.Tools.Sql.BatchParser.dll new file mode 100644 index 0000000..a683758 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Data.Tools.Sql.BatchParser.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Diagnostics.Tracing.EventSource.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Diagnostics.Tracing.EventSource.dll new file mode 100644 index 0000000..91800c9 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Diagnostics.Tracing.EventSource.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Exchange.WebServices.NETStandard.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Exchange.WebServices.NETStandard.dll new file mode 100644 index 0000000..6a199ea Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Exchange.WebServices.NETStandard.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Exchange.WebServices.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Exchange.WebServices.dll new file mode 100644 index 0000000..101589e Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Exchange.WebServices.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Extensions.Configuration.Abstractions.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Extensions.Configuration.Abstractions.dll new file mode 100644 index 0000000..3efa5f2 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Extensions.Configuration.Abstractions.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Extensions.Logging.Abstractions.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Extensions.Logging.Abstractions.dll new file mode 100644 index 0000000..b8dd652 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Extensions.Logging.Abstractions.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Extensions.ObjectPool.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Extensions.ObjectPool.dll new file mode 100644 index 0000000..b44fcf9 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Extensions.ObjectPool.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Extensions.Primitives.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Extensions.Primitives.dll new file mode 100644 index 0000000..c8e5edd Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Extensions.Primitives.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Graph.Core.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Graph.Core.dll new file mode 100644 index 0000000..da304d7 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Graph.Core.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Graph.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Graph.dll new file mode 100644 index 0000000..a3764ef Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Graph.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Identity.Client.Extensions.Msal.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Identity.Client.Extensions.Msal.dll new file mode 100644 index 0000000..a617d77 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Identity.Client.Extensions.Msal.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Identity.Client.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Identity.Client.dll new file mode 100644 index 0000000..8a57b75 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Identity.Client.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.Abstractions.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.Abstractions.dll new file mode 100644 index 0000000..4e6451b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.Abstractions.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll new file mode 100644 index 0000000..513663b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.Clients.ActiveDirectory.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.Clients.ActiveDirectory.dll new file mode 100644 index 0000000..4f408cf Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.Clients.ActiveDirectory.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.JsonWebTokens.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.JsonWebTokens.dll new file mode 100644 index 0000000..61d7cd4 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.JsonWebTokens.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.Logging.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.Logging.dll new file mode 100644 index 0000000..dbb70ec Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.Logging.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll new file mode 100644 index 0000000..99ba141 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.Protocols.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.Protocols.dll new file mode 100644 index 0000000..0bf0638 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.Protocols.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.Tokens.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.Tokens.dll new file mode 100644 index 0000000..0619a4a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.IdentityModel.Tokens.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.OData.Core.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.OData.Core.dll new file mode 100644 index 0000000..0310dd4 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.OData.Core.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.OData.Edm.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.OData.Edm.dll new file mode 100644 index 0000000..3f7d6a2 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.OData.Edm.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.Cors.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.Cors.dll new file mode 100644 index 0000000..587fab4 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.Cors.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.Diagnostics.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.Diagnostics.dll new file mode 100644 index 0000000..b44dbfb Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.Diagnostics.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.Host.SystemWeb.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.Host.SystemWeb.dll new file mode 100644 index 0000000..d324867 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.Host.SystemWeb.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.Security.Cookies.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.Security.Cookies.dll new file mode 100644 index 0000000..46bb919 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.Security.Cookies.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.Security.Jwt.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.Security.Jwt.dll new file mode 100644 index 0000000..9708b23 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.Security.Jwt.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.Security.OAuth.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.Security.OAuth.dll new file mode 100644 index 0000000..0793fef Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.Security.OAuth.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.Security.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.Security.dll new file mode 100644 index 0000000..42493cd Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.Security.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.dll new file mode 100644 index 0000000..2d87006 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Owin.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Practices.ServiceLocation.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Practices.ServiceLocation.dll new file mode 100644 index 0000000..95bbd51 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Practices.ServiceLocation.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Practices.Unity.Configuration.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Practices.Unity.Configuration.dll new file mode 100644 index 0000000..4fa1726 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Practices.Unity.Configuration.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Practices.Unity.RegistrationByConvention.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Practices.Unity.RegistrationByConvention.dll new file mode 100644 index 0000000..e9dd809 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Practices.Unity.RegistrationByConvention.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Practices.Unity.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Practices.Unity.dll new file mode 100644 index 0000000..44c37ab Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Practices.Unity.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.ReportViewer.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.ReportViewer.Common.dll new file mode 100644 index 0000000..7c83bb6 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.ReportViewer.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.ReportViewer.ProcessingObjectModel.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.ReportViewer.ProcessingObjectModel.dll new file mode 100644 index 0000000..6492583 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.ReportViewer.ProcessingObjectModel.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.ReportViewer.WebForms.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.ReportViewer.WebForms.dll new file mode 100644 index 0000000..4050c4a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.ReportViewer.WebForms.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.ServiceBus.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.ServiceBus.dll new file mode 100644 index 0000000..1e1a1de Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.ServiceBus.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Spatial.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Spatial.dll new file mode 100644 index 0000000..e778b04 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Spatial.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.AzureStorageEnum.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.AzureStorageEnum.dll new file mode 100644 index 0000000..9572004 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.AzureStorageEnum.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.BatchParser.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.BatchParser.dll new file mode 100644 index 0000000..7a628ff Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.BatchParser.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.BatchParserClient.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.BatchParserClient.dll new file mode 100644 index 0000000..79c6add Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.BatchParserClient.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.ConnectionInfo.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.ConnectionInfo.dll new file mode 100644 index 0000000..9575af8 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.ConnectionInfo.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.ConnectionInfoExtended.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.ConnectionInfoExtended.dll new file mode 100644 index 0000000..819b744 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.ConnectionInfoExtended.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Diagnostics.STrace.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Diagnostics.STrace.dll new file mode 100644 index 0000000..18f0360 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Diagnostics.STrace.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Dmf.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Dmf.Common.dll new file mode 100644 index 0000000..44e5a31 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Dmf.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Dmf.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Dmf.dll new file mode 100644 index 0000000..94be5d0 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Dmf.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.Collector.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.Collector.dll new file mode 100644 index 0000000..09d24d9 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.Collector.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.CollectorEnum.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.CollectorEnum.dll new file mode 100644 index 0000000..a11cb8a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.CollectorEnum.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.RegisteredServers.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.RegisteredServers.dll new file mode 100644 index 0000000..6f830cc Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.RegisteredServers.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.Sdk.Sfc.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.Sdk.Sfc.dll new file mode 100644 index 0000000..1ee4b2a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.Sdk.Sfc.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.Utility.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.Utility.dll new file mode 100644 index 0000000..125cb4f Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.Utility.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.UtilityEnum.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.UtilityEnum.dll new file mode 100644 index 0000000..2d2b47e Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.UtilityEnum.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.XEvent.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.XEvent.dll new file mode 100644 index 0000000..a5d55f8 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.XEvent.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.XEventDbScoped.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.XEventDbScoped.dll new file mode 100644 index 0000000..82763f9 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.XEventDbScoped.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.XEventDbScopedEnum.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.XEventDbScopedEnum.dll new file mode 100644 index 0000000..6180918 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.XEventDbScopedEnum.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.XEventEnum.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.XEventEnum.dll new file mode 100644 index 0000000..43479ae Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Management.XEventEnum.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.PolicyEnum.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.PolicyEnum.dll new file mode 100644 index 0000000..19d58e4 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.PolicyEnum.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.RegSvrEnum.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.RegSvrEnum.dll new file mode 100644 index 0000000..3919aa7 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.RegSvrEnum.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.SString.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.SString.dll new file mode 100644 index 0000000..9a91e51 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.SString.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.ServiceBrokerEnum.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.ServiceBrokerEnum.dll new file mode 100644 index 0000000..8d877a8 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.ServiceBrokerEnum.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Smo.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Smo.dll new file mode 100644 index 0000000..10b5fc5 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Smo.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.SmoExtended.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.SmoExtended.dll new file mode 100644 index 0000000..f2388e4 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.SmoExtended.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.SqlClrProvider.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.SqlClrProvider.dll new file mode 100644 index 0000000..2cecf5b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.SqlClrProvider.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.SqlEnum.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.SqlEnum.dll new file mode 100644 index 0000000..14a6c49 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.SqlEnum.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.SqlTDiagm.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.SqlTDiagm.dll new file mode 100644 index 0000000..93553db Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.SqlTDiagm.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.SqlWmiManagement.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.SqlWmiManagement.dll new file mode 100644 index 0000000..6bf6854 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.SqlWmiManagement.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Types.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Types.dll new file mode 100644 index 0000000..3bdb578 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.Types.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.WmiEnum.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.WmiEnum.dll new file mode 100644 index 0000000..25a335b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.SqlServer.WmiEnum.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.VisualStudio.ActivityPack.Data.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.VisualStudio.ActivityPack.Data.dll new file mode 100644 index 0000000..f3cc622 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.VisualStudio.ActivityPack.Data.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Web.Administration.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Web.Administration.dll new file mode 100644 index 0000000..6e12bc2 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Web.Administration.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Web.Delegation.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Web.Delegation.dll new file mode 100644 index 0000000..7bd8464 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Web.Delegation.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Web.Deployment.Tracing.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Web.Deployment.Tracing.dll new file mode 100644 index 0000000..6147b47 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Web.Deployment.Tracing.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Web.Deployment.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Web.Deployment.dll new file mode 100644 index 0000000..199709b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Web.Deployment.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Web.Infrastructure.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Web.Infrastructure.dll new file mode 100644 index 0000000..33ffd21 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Web.Infrastructure.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Win32.Registry.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Win32.Registry.dll new file mode 100644 index 0000000..e446f92 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.Win32.Registry.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Microsoft.WindowsAzure.Storage.dll b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.WindowsAzure.Storage.dll new file mode 100644 index 0000000..d25230b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Microsoft.WindowsAzure.Storage.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/MimeKit.dll b/F4SDM42WebApi/M42Libraries/26.1/MimeKit.dll new file mode 100644 index 0000000..d13d498 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/MimeKit.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/MySql.Data.dll b/F4SDM42WebApi/M42Libraries/26.1/MySql.Data.dll new file mode 100644 index 0000000..95a2d9b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/MySql.Data.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/NLog.dll b/F4SDM42WebApi/M42Libraries/26.1/NLog.dll new file mode 100644 index 0000000..599dbdf Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/NLog.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Newtonsoft.Json.dll b/F4SDM42WebApi/M42Libraries/26.1/Newtonsoft.Json.dll new file mode 100644 index 0000000..341d08f Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Newtonsoft.Json.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Northwoods.GoWeb.Layout.dll b/F4SDM42WebApi/M42Libraries/26.1/Northwoods.GoWeb.Layout.dll new file mode 100644 index 0000000..20a6e47 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Northwoods.GoWeb.Layout.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Northwoods.GoWeb.dll b/F4SDM42WebApi/M42Libraries/26.1/Northwoods.GoWeb.dll new file mode 100644 index 0000000..0439a7a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Northwoods.GoWeb.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Owin.dll b/F4SDM42WebApi/M42Libraries/26.1/Owin.dll new file mode 100644 index 0000000..ba6e21e Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Owin.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/PWDTK.dll b/F4SDM42WebApi/M42Libraries/26.1/PWDTK.dll new file mode 100644 index 0000000..e0df1ea Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/PWDTK.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Pipelines.Sockets.Unofficial.dll b/F4SDM42WebApi/M42Libraries/26.1/Pipelines.Sockets.Unofficial.dll new file mode 100644 index 0000000..0ac3e28 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Pipelines.Sockets.Unofficial.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/PreMailer.Net.dll b/F4SDM42WebApi/M42Libraries/26.1/PreMailer.Net.dll new file mode 100644 index 0000000..46a2200 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/PreMailer.Net.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Prometheus.NetStandard.dll b/F4SDM42WebApi/M42Libraries/26.1/Prometheus.NetStandard.dll new file mode 100644 index 0000000..01a5923 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Prometheus.NetStandard.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/RabbitMQ.Client.dll b/F4SDM42WebApi/M42Libraries/26.1/RabbitMQ.Client.dll new file mode 100644 index 0000000..4a86d24 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/RabbitMQ.Client.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/SequentialGuid.dll b/F4SDM42WebApi/M42Libraries/26.1/SequentialGuid.dll new file mode 100644 index 0000000..ad47444 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/SequentialGuid.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Serilog.Sinks.Console.dll b/F4SDM42WebApi/M42Libraries/26.1/Serilog.Sinks.Console.dll new file mode 100644 index 0000000..b16608e Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Serilog.Sinks.Console.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Serilog.Sinks.File.dll b/F4SDM42WebApi/M42Libraries/26.1/Serilog.Sinks.File.dll new file mode 100644 index 0000000..c5606e6 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Serilog.Sinks.File.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Serilog.dll b/F4SDM42WebApi/M42Libraries/26.1/Serilog.dll new file mode 100644 index 0000000..c531b5b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Serilog.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/StackExchange.Redis.dll b/F4SDM42WebApi/M42Libraries/26.1/StackExchange.Redis.dll new file mode 100644 index 0000000..7062111 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/StackExchange.Redis.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Buffers.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Buffers.dll new file mode 100644 index 0000000..f2d83c5 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Buffers.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.ClientModel.dll b/F4SDM42WebApi/M42Libraries/26.1/System.ClientModel.dll new file mode 100644 index 0000000..1363faf Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.ClientModel.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.ComponentModel.Annotations.dll b/F4SDM42WebApi/M42Libraries/26.1/System.ComponentModel.Annotations.dll new file mode 100644 index 0000000..89f2b7a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.ComponentModel.Annotations.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Configuration.ConfigurationManager.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Configuration.ConfigurationManager.dll new file mode 100644 index 0000000..ef88fd9 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Configuration.ConfigurationManager.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Data.DataSetExtensions.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Data.DataSetExtensions.dll new file mode 100644 index 0000000..5a1ad03 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Data.DataSetExtensions.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Data.OleDb.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Data.OleDb.dll new file mode 100644 index 0000000..74314d6 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Data.OleDb.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Data.SQLite.EF6.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Data.SQLite.EF6.dll new file mode 100644 index 0000000..3b7a979 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Data.SQLite.EF6.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Data.SQLite.Linq.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Data.SQLite.Linq.dll new file mode 100644 index 0000000..4bb9dc2 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Data.SQLite.Linq.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Data.SQLite.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Data.SQLite.dll new file mode 100644 index 0000000..13ec61c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Data.SQLite.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Diagnostics.DiagnosticSource.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Diagnostics.DiagnosticSource.dll new file mode 100644 index 0000000..b58b31a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Diagnostics.DiagnosticSource.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Diagnostics.PerformanceCounter.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Diagnostics.PerformanceCounter.dll new file mode 100644 index 0000000..da3bb5c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Diagnostics.PerformanceCounter.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.DirectoryServices.dll b/F4SDM42WebApi/M42Libraries/26.1/System.DirectoryServices.dll new file mode 100644 index 0000000..0bf94ff Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.DirectoryServices.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Formats.Asn1.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Formats.Asn1.dll new file mode 100644 index 0000000..2408709 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Formats.Asn1.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.IO.FileSystem.AccessControl.dll b/F4SDM42WebApi/M42Libraries/26.1/System.IO.FileSystem.AccessControl.dll new file mode 100644 index 0000000..8cc5cb9 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.IO.FileSystem.AccessControl.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.IO.Pipelines.dll b/F4SDM42WebApi/M42Libraries/26.1/System.IO.Pipelines.dll new file mode 100644 index 0000000..0e68c22 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.IO.Pipelines.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.IdentityModel.Tokens.Jwt.dll b/F4SDM42WebApi/M42Libraries/26.1/System.IdentityModel.Tokens.Jwt.dll new file mode 100644 index 0000000..c997fdb Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.IdentityModel.Tokens.Jwt.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Json.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Json.dll new file mode 100644 index 0000000..11dd678 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Json.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Management.Automation.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Management.Automation.dll new file mode 100644 index 0000000..4774bbd Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Management.Automation.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Memory.Data.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Memory.Data.dll new file mode 100644 index 0000000..5aa3810 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Memory.Data.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Memory.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Memory.dll new file mode 100644 index 0000000..4617199 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Memory.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Net.Http.Formatting.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Net.Http.Formatting.dll new file mode 100644 index 0000000..e9e80be Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Net.Http.Formatting.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Net.WebSockets.Client.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Net.WebSockets.Client.dll new file mode 100644 index 0000000..338ed37 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Net.WebSockets.Client.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Net.WebSockets.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Net.WebSockets.dll new file mode 100644 index 0000000..c6c2a4c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Net.WebSockets.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Numerics.Vectors.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Numerics.Vectors.dll new file mode 100644 index 0000000..0865972 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Numerics.Vectors.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Runtime.Caching.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Runtime.Caching.dll new file mode 100644 index 0000000..2d5250a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Runtime.Caching.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Runtime.CompilerServices.Unsafe.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Runtime.CompilerServices.Unsafe.dll new file mode 100644 index 0000000..c5ba4e4 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Runtime.CompilerServices.Unsafe.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Runtime.Serialization.Primitives.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Runtime.Serialization.Primitives.dll new file mode 100644 index 0000000..530d2fb Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Runtime.Serialization.Primitives.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Security.AccessControl.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Security.AccessControl.dll new file mode 100644 index 0000000..752972c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Security.AccessControl.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.Algorithms.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.Algorithms.dll new file mode 100644 index 0000000..ab118cb Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.Algorithms.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.Cng.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.Cng.dll new file mode 100644 index 0000000..151c620 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.Cng.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.Encoding.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.Encoding.dll new file mode 100644 index 0000000..d94ff62 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.Encoding.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.OpenSsl.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.OpenSsl.dll new file mode 100644 index 0000000..7391cf0 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.OpenSsl.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.Pkcs.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.Pkcs.dll new file mode 100644 index 0000000..9c364c4 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.Pkcs.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.Primitives.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.Primitives.dll new file mode 100644 index 0000000..e0e747f Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.Primitives.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.ProtectedData.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.ProtectedData.dll new file mode 100644 index 0000000..e75bc01 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.ProtectedData.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.X509Certificates.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.X509Certificates.dll new file mode 100644 index 0000000..00eb49c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Security.Cryptography.X509Certificates.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Security.Permissions.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Security.Permissions.dll new file mode 100644 index 0000000..5a5f765 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Security.Permissions.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Security.Principal.Windows.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Security.Principal.Windows.dll new file mode 100644 index 0000000..54f7829 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Security.Principal.Windows.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.ServiceModel.Duplex.dll b/F4SDM42WebApi/M42Libraries/26.1/System.ServiceModel.Duplex.dll new file mode 100644 index 0000000..60e0aee Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.ServiceModel.Duplex.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.ServiceModel.Federation.dll b/F4SDM42WebApi/M42Libraries/26.1/System.ServiceModel.Federation.dll new file mode 100644 index 0000000..7ae7af6 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.ServiceModel.Federation.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.ServiceModel.Http.dll b/F4SDM42WebApi/M42Libraries/26.1/System.ServiceModel.Http.dll new file mode 100644 index 0000000..effa2d1 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.ServiceModel.Http.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.ServiceModel.Primitives.dll b/F4SDM42WebApi/M42Libraries/26.1/System.ServiceModel.Primitives.dll new file mode 100644 index 0000000..e13bc0c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.ServiceModel.Primitives.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.ServiceModel.Security.dll b/F4SDM42WebApi/M42Libraries/26.1/System.ServiceModel.Security.dll new file mode 100644 index 0000000..13e5ff5 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.ServiceModel.Security.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Spatial.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Spatial.dll new file mode 100644 index 0000000..2eb524f Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Spatial.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Text.Encodings.Web.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Text.Encodings.Web.dll new file mode 100644 index 0000000..3d16c7e Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Text.Encodings.Web.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Text.Json.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Text.Json.dll new file mode 100644 index 0000000..e8bee3a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Text.Json.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Threading.Channels.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Threading.Channels.dll new file mode 100644 index 0000000..772c262 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Threading.Channels.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Threading.Tasks.Extensions.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Threading.Tasks.Extensions.dll new file mode 100644 index 0000000..eeec928 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Threading.Tasks.Extensions.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.ValueTuple.dll b/F4SDM42WebApi/M42Libraries/26.1/System.ValueTuple.dll new file mode 100644 index 0000000..4ce28fd Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.ValueTuple.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Web.Cors.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Cors.dll new file mode 100644 index 0000000..6f3da24 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Cors.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Web.Helpers.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Helpers.dll new file mode 100644 index 0000000..5979bab Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Helpers.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Web.Http.Cors.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Http.Cors.dll new file mode 100644 index 0000000..fd0b539 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Http.Cors.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Web.Http.Owin.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Http.Owin.dll new file mode 100644 index 0000000..e29f123 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Http.Owin.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Web.Http.Tracing.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Http.Tracing.dll new file mode 100644 index 0000000..4e54032 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Http.Tracing.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Web.Http.WebHost.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Http.WebHost.dll new file mode 100644 index 0000000..c374283 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Http.WebHost.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Web.Http.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Http.dll new file mode 100644 index 0000000..7e3bd30 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Http.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Web.Mvc.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Mvc.dll new file mode 100644 index 0000000..781deee Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Mvc.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Web.OData.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Web.OData.dll new file mode 100644 index 0000000..d68e666 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Web.OData.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Web.Razor.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Razor.dll new file mode 100644 index 0000000..a992c65 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Razor.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Web.Webpages.Deployment.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Webpages.Deployment.dll new file mode 100644 index 0000000..295581a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Webpages.Deployment.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Web.Webpages.Razor.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Webpages.Razor.dll new file mode 100644 index 0000000..6d830f3 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Webpages.Razor.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/System.Web.Webpages.dll b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Webpages.dll new file mode 100644 index 0000000..4a910af Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/System.Web.Webpages.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Telerik.Licensing.Runtime.dll b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Licensing.Runtime.dll new file mode 100644 index 0000000..a4152f6 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Licensing.Runtime.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Controls.GridView.dll b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Controls.GridView.dll new file mode 100644 index 0000000..c602d27 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Controls.GridView.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Controls.ImageEditor.dll b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Controls.ImageEditor.dll new file mode 100644 index 0000000..1dfadc8 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Controls.ImageEditor.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Controls.Input.dll b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Controls.Input.dll new file mode 100644 index 0000000..c746640 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Controls.Input.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Controls.Navigation.dll b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Controls.Navigation.dll new file mode 100644 index 0000000..f05932d Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Controls.Navigation.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Controls.RibbonView.dll b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Controls.RibbonView.dll new file mode 100644 index 0000000..2cddee9 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Controls.RibbonView.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Controls.RichTextBoxUI.dll b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Controls.RichTextBoxUI.dll new file mode 100644 index 0000000..c14e1ec Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Controls.RichTextBoxUI.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Controls.dll b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Controls.dll new file mode 100644 index 0000000..b0c30ce Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Controls.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Data.dll b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Data.dll new file mode 100644 index 0000000..5e61f71 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Data.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Documents.Core.dll b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Documents.Core.dll new file mode 100644 index 0000000..c8dcc03 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Documents.Core.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Documents.Flow.dll b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Documents.Flow.dll new file mode 100644 index 0000000..bd43b59 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Documents.Flow.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Documents.FormatProviders.Html.dll b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Documents.FormatProviders.Html.dll new file mode 100644 index 0000000..3a03b9c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Documents.FormatProviders.Html.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Documents.FormatProviders.Xaml.dll b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Documents.FormatProviders.Xaml.dll new file mode 100644 index 0000000..0904f40 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Documents.FormatProviders.Xaml.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Documents.dll b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Documents.dll new file mode 100644 index 0000000..55480cd Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/Telerik.Windows.Documents.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/log4net.dll b/F4SDM42WebApi/M42Libraries/26.1/log4net.dll new file mode 100644 index 0000000..79b27e2 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/log4net.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/m42.auditing.abstractions.dll b/F4SDM42WebApi/M42Libraries/26.1/m42.auditing.abstractions.dll new file mode 100644 index 0000000..c18edeb Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/m42.auditing.abstractions.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/m42.auditing.dll b/F4SDM42WebApi/M42Libraries/26.1/m42.auditing.dll new file mode 100644 index 0000000..742709f Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/m42.auditing.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/m42.auditing.dto.abstractions.dll b/F4SDM42WebApi/M42Libraries/26.1/m42.auditing.dto.abstractions.dll new file mode 100644 index 0000000..8845046 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/m42.auditing.dto.abstractions.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/m42.cloud.identity.abstractions.dll b/F4SDM42WebApi/M42Libraries/26.1/m42.cloud.identity.abstractions.dll new file mode 100644 index 0000000..44876a0 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/m42.cloud.identity.abstractions.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/m42.cloud.identity.dll b/F4SDM42WebApi/M42Libraries/26.1/m42.cloud.identity.dll new file mode 100644 index 0000000..fad94df Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/m42.cloud.identity.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/stdole.dll b/F4SDM42WebApi/M42Libraries/26.1/stdole.dll new file mode 100644 index 0000000..331a0fa Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/stdole.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.AssetManager.BizLogic.Client.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.AssetManager.BizLogic.Client.dll new file mode 100644 index 0000000..20a1650 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.AssetManager.BizLogic.Client.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.AssetManager.BizLogic.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.AssetManager.BizLogic.Common.dll new file mode 100644 index 0000000..84056f8 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.AssetManager.BizLogic.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.AssetManager.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.AssetManager.BizLogic.dll new file mode 100644 index 0000000..de4fb9d Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.AssetManager.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.AssetManager.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.AssetManager.Common.dll new file mode 100644 index 0000000..deccc82 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.AssetManager.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.AssetManager.WebUI.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.AssetManager.WebUI.dll new file mode 100644 index 0000000..64e5f92 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.AssetManager.WebUI.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.ContractManager.BizLogic.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.ContractManager.BizLogic.Common.dll new file mode 100644 index 0000000..06c05eb Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.ContractManager.BizLogic.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.ContractManager.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.ContractManager.BizLogic.dll new file mode 100644 index 0000000..d3e7176 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.ContractManager.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.Empirum.Api.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.Empirum.Api.dll new file mode 100644 index 0000000..fb8bd85 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.Empirum.Api.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.Empirum.BizLayer.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.Empirum.BizLayer.dll new file mode 100644 index 0000000..8005049 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.Empirum.BizLayer.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.LicenseManager.BizLogic.Client.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.LicenseManager.BizLogic.Client.dll new file mode 100644 index 0000000..0b4f6e7 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.LicenseManager.BizLogic.Client.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.LicenseManager.BizLogic.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.LicenseManager.BizLogic.Common.dll new file mode 100644 index 0000000..6176522 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.LicenseManager.BizLogic.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.LicenseManager.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.LicenseManager.BizLogic.dll new file mode 100644 index 0000000..d635d0e Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.LicenseManager.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.LicenseManager.LIS.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.LicenseManager.LIS.BizLogic.dll new file mode 100644 index 0000000..a47a0e4 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.LicenseManager.LIS.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.LicenseManager.LIS.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.LicenseManager.LIS.Common.dll new file mode 100644 index 0000000..a6f9641 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.LicenseManager.LIS.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.LicenseManager.LISTransfer.Server.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.LicenseManager.LISTransfer.Server.dll new file mode 100644 index 0000000..4c7d20d Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.LicenseManager.LISTransfer.Server.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.MasterData.BizLogic.Client.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.MasterData.BizLogic.Client.dll new file mode 100644 index 0000000..9dbc408 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.MasterData.BizLogic.Client.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.MasterData.BizLogic.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.MasterData.BizLogic.Common.dll new file mode 100644 index 0000000..accfbe6 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.MasterData.BizLogic.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.Portal.BizLayer.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.Portal.BizLayer.dll new file mode 100644 index 0000000..f4104ce Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.Portal.BizLayer.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.Portal.Client.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.Portal.Client.dll new file mode 100644 index 0000000..ed56a37 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.Portal.Client.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.Portal.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.Portal.Common.dll new file mode 100644 index 0000000..bef1733 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.Portal.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.Portal.UI.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.Portal.UI.dll new file mode 100644 index 0000000..95e5009 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.Portal.UI.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.Portal.WebUI.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.Portal.WebUI.dll new file mode 100644 index 0000000..264896a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.Portal.WebUI.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Alerting.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Alerting.BizLogic.dll new file mode 100644 index 0000000..d959a9d Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Alerting.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.BizLayer.Client.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.BizLayer.Client.Common.dll new file mode 100644 index 0000000..910cbc2 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.BizLayer.Client.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.BizLayer.Client.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.BizLayer.Client.dll new file mode 100644 index 0000000..da3cfca Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.BizLayer.Client.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.BizLayer.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.BizLayer.Common.dll new file mode 100644 index 0000000..838018e Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.BizLayer.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.BizLayer.Workflows.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.BizLayer.Workflows.dll new file mode 100644 index 0000000..1432b3e Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.BizLayer.Workflows.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.BizLayer.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.BizLayer.dll new file mode 100644 index 0000000..400d3c4 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.BizLayer.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.ComplianceRules.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.ComplianceRules.BizLogic.dll new file mode 100644 index 0000000..c21a2f3 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.ComplianceRules.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.ComplianceRules.WebUI.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.ComplianceRules.WebUI.dll new file mode 100644 index 0000000..2d81be3 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.ComplianceRules.WebUI.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.ComplianceRules.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.ComplianceRules.dll new file mode 100644 index 0000000..6f2b1e6 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.ComplianceRules.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Config.DTS.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Config.DTS.dll new file mode 100644 index 0000000..860fb91 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Config.DTS.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Config.Shared.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Config.Shared.dll new file mode 100644 index 0000000..97b1a7c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Config.Shared.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Config.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Config.dll new file mode 100644 index 0000000..4bf6217 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Config.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Connectors.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Connectors.dll new file mode 100644 index 0000000..5e184c0 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Connectors.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Contracts.dll new file mode 100644 index 0000000..31715cd Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.DataLayer.Contracts.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.DataLayer.Contracts.dll new file mode 100644 index 0000000..9bae900 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.DataLayer.Contracts.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.DataLayer.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.DataLayer.dll new file mode 100644 index 0000000..3cd1654 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.DataLayer.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.DatabaseFileStorage.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.DatabaseFileStorage.dll new file mode 100644 index 0000000..6f7079d Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.DatabaseFileStorage.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Engines.Workers.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Engines.Workers.dll new file mode 100644 index 0000000..71d40c0 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Engines.Workers.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Engines.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Engines.dll new file mode 100644 index 0000000..10ea309 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Engines.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.GDIE.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.GDIE.BizLogic.dll new file mode 100644 index 0000000..79549b6 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.GDIE.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.GDIE.DALogic.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.GDIE.DALogic.dll new file mode 100644 index 0000000..67627ba Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.GDIE.DALogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.GDIE.WebUI.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.GDIE.WebUI.dll new file mode 100644 index 0000000..bd9280c Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.GDIE.WebUI.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.History.Consolidator.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.History.Consolidator.dll new file mode 100644 index 0000000..8a72ce2 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.History.Consolidator.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.History.Installer.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.History.Installer.dll new file mode 100644 index 0000000..05b0bdd Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.History.Installer.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Instrumentation.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Instrumentation.dll new file mode 100644 index 0000000..db1efdd Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Instrumentation.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Licensing.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Licensing.dll new file mode 100644 index 0000000..1f2e1cc Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Licensing.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.MailServers.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.MailServers.dll new file mode 100644 index 0000000..1a94ed9 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.MailServers.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Security.Cryptography.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Security.Cryptography.dll new file mode 100644 index 0000000..9719c48 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Security.Cryptography.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Security.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Security.dll new file mode 100644 index 0000000..cde929a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Security.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Utility.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Utility.dll new file mode 100644 index 0000000..8241e8a Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.Utility.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.WebUI.Components.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.WebUI.Components.dll new file mode 100644 index 0000000..ef428c2 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.WebUI.Components.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.WebUI.Objects.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.WebUI.Objects.dll new file mode 100644 index 0000000..81b6f8b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.WebUI.Objects.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.WebUI.Resources.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.WebUI.Resources.dll new file mode 100644 index 0000000..ed28c9b Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.SPS.WebUI.Resources.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.ServiceManager.BizLogic.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.ServiceManager.BizLogic.dll new file mode 100644 index 0000000..1748853 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.ServiceManager.BizLogic.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.ServiceManager.Common.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.ServiceManager.Common.dll new file mode 100644 index 0000000..06f7819 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.ServiceManager.Common.dll differ diff --git a/F4SDM42WebApi/M42Libraries/26.1/update4u.Templates.VS2010.Core.dll b/F4SDM42WebApi/M42Libraries/26.1/update4u.Templates.VS2010.Core.dll new file mode 100644 index 0000000..5f09fa7 Binary files /dev/null and b/F4SDM42WebApi/M42Libraries/26.1/update4u.Templates.VS2010.Core.dll differ diff --git a/F4SDM42WebApi/M42SandboxedExtension.targets b/F4SDM42WebApi/M42SandboxedExtension.targets new file mode 100644 index 0000000..c7ca7e1 --- /dev/null +++ b/F4SDM42WebApi/M42SandboxedExtension.targets @@ -0,0 +1,90 @@ + + + $(MSBuildProjectDirectory)\BasePackage\Assemblies + $(MSBuildProjectDirectory)\Root\InstalledPackages\Assemblies\$(M42ExtensionId) + $(MSBuildProjectName)*.* + win-x64;linux-x64 + C4IT - F4SD M42 ESM Integration Configuration Package + $(MSBuildProjectDirectory)\..\PackageTemplate + $(MSBuildProjectDirectory)\..\artifacts + $(MSBuildProjectDirectory)\BuildM42Package.ps1 + + + + + <_M42RidList Include="$(M42DefaultRids)" /> + + + + + + true + + + + + + + + + + <_M42FlatRoot Include="$(TargetDir)$(M42AssemblyPattern)" /> + + + + + + + + + + + + + + + + <_M42Rid Include="$(TargetDir)**\$(M42AssemblyPattern)" /> + + + + + + + + + + + + + + + + + diff --git a/F4SDM42WebApi/package.json b/F4SDM42WebApi/package.json new file mode 100644 index 0000000..06ff48f --- /dev/null +++ b/F4SDM42WebApi/package.json @@ -0,0 +1,16 @@ +{ + "Id": "6673a25d-33d6-4072-91d9-abed4be1a966", + "Vendor": "Consulting4IT GmbH", + "Name": "C4IT.F4SD.M42WebApi", + "Version": "1.3.0.0", + "Prerequisites": { + "MinimalRequiredProductVersion": "26.1.0", + "DependentPackages": [] + }, + "SetupDirectives": { + "MaintenanceMode": false, + "RecycleWebApplication": false, + "RestartM42WindowsServices": false + }, + "Sandboxed": true +} diff --git a/PackageTemplate/Files/WM/workspaces/C4IT_F4SD/F4SD.min.js b/PackageTemplate/Files/WM/workspaces/C4IT_F4SD/F4SD.min.js new file mode 100644 index 0000000..e67f356 --- /dev/null +++ b/PackageTemplate/Files/WM/workspaces/C4IT_F4SD/F4SD.min.js @@ -0,0 +1,3 @@ +/*v1.0.0 (2024-10-29)*/var w;!function(o){"use strict";var e="c4it-f4sd-icons";o.mx=o.mx||{},o.mx.workspacesConfig=o.mx.workspacesConfig||{},o.mx.workspacesConfig.modules=o.mx.workspacesConfig.modules||{},o.mx.workspacesConfig.modules.add=o.mx.workspacesConfig.modules.add||function(e,n){o.mx.workspacesConfig.modules[e]=n},o.mx.workspacesConfig.modules.add("mx.C4IT.F4SD",{name:"mx.C4IT.F4SD",config:["$mdIconProvider",function(n){n.iconSet(e,"workspaces/C4IT_F4SD/F4SDIcons.svg"),o.mx=o.mx||{},o.mx.components=o.mx.components||{},o.mx.components.Icons=o.mx.components.Icons||{},o.mx.components.Icons.unshift({id:e,name:"C4IT F4SD Icons",icons:[{SVG:!0,id:e+":icon-f4sd",name:"F4SD Icon",keywords:["c4it","custom","f4sd"]},{SVG:!0,id:e+":icon-f4sd-coloured",name:"F4SD Icon (coloured)",keywords:["c4it","custom","f4sd"]}]})}]})} +(window),window,angular.module("mx.C4IT.F4SD").controller("mx.C4IT.F4SD.Actions.callF4SD",["mx.shell.Config","mx.SolutionBuilderAgent.Http","mx.shell.NotificationService","mx.internationalization",function(o,e,n,s){var t=this;this.restHost=o.settings.restHosts.default,this.messageF4SDOpened=s.get("c4it.f4sd.action-open-called")||"F4SD is beeing opened...",this.execute=function(o,s){var c=o[0]["Sys-ObjectId"]||o[0].ID;try{t.controllerParams=new URLSearchParams(s.controllerParams)}catch(a){console.log(a),n.error("Action config parameters format exception");return} +let i=new URL("/api/c4itf4sdwebapi/getdirectlinkf4sd/",t.restHost);i.searchParams.append("type",t.controllerParams.get("type")||s.name),i.searchParams.append("eoid",c),e.get(i.pathname+i.search).then(function(o){try{let e=new URL(o);"f4sdsend:"==e.protocol&&(t.controllerParams.has("showNotification")&&1==t.controllerParams.get("showNotification")&&n.info(t.messageF4SDOpened),window.location.href=o)}catch(s){console.log(s),n.error("Service not available")}},function o(e){console.log(e),n.error("Service not available")})}}]); \ No newline at end of file diff --git a/PackageTemplate/Files/WM/workspaces/C4IT_F4SD/F4SDIcons.svg b/PackageTemplate/Files/WM/workspaces/C4IT_F4SD/F4SDIcons.svg new file mode 100644 index 0000000..194f4bd --- /dev/null +++ b/PackageTemplate/Files/WM/workspaces/C4IT_F4SD/F4SDIcons.svg @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/PackageTemplate/Files/WM/workspaces/C4IT_F4SD/workspace.json b/PackageTemplate/Files/WM/workspaces/C4IT_F4SD/workspace.json new file mode 100644 index 0000000..816b055 --- /dev/null +++ b/PackageTemplate/Files/WM/workspaces/C4IT_F4SD/workspace.json @@ -0,0 +1,7 @@ +{ + "description": "C4IT - F4SD - M42 ESM Integration", + "version": "1.0.0", + "resources": [ + "F4SD.min.js" + ] +} \ No newline at end of file diff --git a/PackageTemplate/install.xml b/PackageTemplate/install.xml new file mode 100644 index 0000000..8ca8906 --- /dev/null +++ b/PackageTemplate/install.xml @@ -0,0 +1,45 @@ + + +