This commit is contained in:
Drechsler, Meik
2025-10-15 14:56:07 +02:00
commit f563d78417
896 changed files with 654481 additions and 0 deletions

38
LiamTestTeams/App.config Normal file
View File

@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="7.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.1" newVersion="5.0.0.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Graph.Core" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.24.0.0" newVersion="1.24.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Identity.Client" publicKeyToken="0a613f4dd989e8ae" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.27.0.0" newVersion="4.27.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

BIN
LiamTestTeams/C4IT.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 470 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 750 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 861 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 626 B

View File

@@ -0,0 +1,155 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{6197C490-07C6-4313-8E0F-AADC27776473}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>LiamTestTeams</RootNamespace>
<AssemblyName>LiamTestTeams</AssemblyName>
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>False</Deterministic>
<SccProjectName>SAK</SccProjectName>
<SccLocalPath>SAK</SccLocalPath>
<SccAuxPath>SAK</SccAuxPath>
<SccProvider>SAK</SccProvider>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>C4IT.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\_shared\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.IdentityModel" />
<Reference Include="System.Numerics" />
<Reference Include="System.Web" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\..\Common Code\Configuration\C4IT.Configuration.ConfigHelper.cs">
<Link>Common\C4IT.Configuration.ConfigHelper.cs</Link>
</Compile>
<Compile Include="..\..\Common Code\Security\C4IT.Security.SecurePassword.cs">
<Link>Common\C4IT.Security.SecurePassword.cs</Link>
</Compile>
<Compile Include="..\SharedAssemblyInfo.cs">
<Link>Properties\SharedAssemblyInfo.cs</Link>
</Compile>
<Compile Include="cLiamTestTeamsConfig.cs" />
<Compile Include="ctrlTabLiam.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="ctrlTabLiam.Designer.cs">
<DependentUpon>ctrlTabLiam.cs</DependentUpon>
</Compile>
<Compile Include="frmMain.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="frmMain.Designer.cs">
<DependentUpon>frmMain.cs</DependentUpon>
</Compile>
<Compile Include="frmPermissionInput.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="frmPermissionInput.Designer.cs">
<DependentUpon>frmPermissionInput.cs</DependentUpon>
</Compile>
<Compile Include="NodesBase.cs" />
<Compile Include="NodesLiam.cs" />
<Compile Include="NodesMsTeams.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="ctrlTabLiam.resx">
<DependentUpon>ctrlTabLiam.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="frmMain.resx">
<DependentUpon>frmMain.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="frmPermissionInput.resx">
<DependentUpon>frmPermissionInput.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<Content Include="C4IT.ico" />
<Content Include="Images\ChannelFolder_32.png" />
<Content Include="Images\Channel_32.png" />
<Content Include="Images\Folder_32.png" />
<Content Include="Images\Team_32.png" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\LiamBaseClasses\LiamBaseClasses.csproj">
<Project>{3531c9e6-cf6e-458e-b604-4a5a8d1c7ab0}</Project>
<Name>LiamBaseClasses</Name>
</ProjectReference>
<ProjectReference Include="..\LiamHelper\LiamHelper.csproj">
<Project>{6b0e73a6-f918-42d5-9525-d59d4d16283d}</Project>
<Name>LiamHelper</Name>
</ProjectReference>
<ProjectReference Include="..\LiamMsGraph\LiamMsGraph.csproj">
<Project>{452827db-14ff-469e-af41-1a24e1875bda}</Project>
<Name>LiamMsGraph</Name>
</ProjectReference>
<ProjectReference Include="..\LiamMsTeams\LiamMsTeams.csproj">
<Project>{dacbd3dc-1866-4b39-964a-d2a8dea2774c}</Project>
<Name>LiamMsTeams</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@@ -0,0 +1,10 @@
""
{
"FILE_VERSION" = "9237"
"ENLISTMENT_CHOICE" = "NEVER"
"PROJECT_FILE_RELATIVE_PATH" = ""
"NUMBER_OF_EXCLUDED_FILES" = "0"
"ORIGINAL_PROJECT_FILE_PATH" = ""
"NUMBER_OF_NESTED_PROJECTS" = "0"
"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
}

124
LiamTestTeams/NodesBase.cs Normal file
View File

@@ -0,0 +1,124 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using C4IT.LIAM;
namespace LiamTestTeams
{
public class TreeNodeBase
{
public const int iconIndexUnknown = 8;
public TreeNodeBase Parent = null;
public virtual bool AutoResolved()
{
return false;
}
virtual public string GetInfoText()
{
return "";
}
virtual public string GetUID()
{
return null;
}
virtual public async Task<List<TreeNodeBase>> ResolveAsync(bool ResolveAlways = false)
{
await Task.Delay(0);
return null;
}
virtual public bool IsResolved()
{
return true;
}
public virtual int ImageIndex()
{
return iconIndexUnknown;
}
public string GetJson()
{
var set = new JsonSerializerSettings()
{
Formatting = Formatting.Indented
};
var RetVal = JsonConvert.SerializeObject(GetJsonObject(), set);
return RetVal;
}
public virtual dynamic GetJsonObject()
{
return null;
}
public virtual bool SupportPermissionAdd()
{
return false;
}
public virtual bool SupportPermissionRemoveDirect()
{
return false;
}
public virtual bool SupportPermissionRemoveByValue()
{
return false;
}
public virtual async Task<bool> AddPermission(eLiamAccessRoles Role, string Identity)
{
await Task.Delay(0);
throw new InvalidOperationException($"Add permission not supported for '{this.GetType()}'");
}
public virtual async Task<bool> RemovePermissionByValue(eLiamAccessRoles Role, string Identity)
{
await Task.Delay(0);
throw new InvalidOperationException($"Add permission not supported for '{this.GetType()}'");
}
public virtual async Task<bool> RemovePermissionDirect()
{
await Task.Delay(0);
throw new InvalidOperationException($"Remove permission not supported for '{this.GetType()}'");
}
public virtual List<eLiamAccessRoles> ValidPermissionRoles()
{
return null;
}
public virtual string getLastError() { return null; }
public virtual async Task<TreeNodeBase> LoadFromUID()
{
await Task.Delay(0);
return null;
}
}
public abstract class TreeNodeRoot : TreeNodeBase
{
public cLiamProviderData Provider;
public TreeNodeRoot(cLiamProviderData Provider)
{
this.Provider = Provider;
}
public abstract Task<bool> LogonAsync();
}
}

484
LiamTestTeams/NodesLiam.cs Normal file
View File

@@ -0,0 +1,484 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using C4IT.LIAM;
using C4IT.Logging;
using static C4IT.Logging.cLogManager;
namespace LiamTestTeams
{
public class TreeNodeLiamRoot : TreeNodeRoot
{
public cLiamProviderBase ProviderBase;
public TreeNodeLiamRoot(cLiamProviderData Provider) : base(Provider)
{
}
public bool Load()
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
try
{
var LiamCfg = new cLiamConfiguration();
ProviderBase = cLiamProviderBase.CreateInstance(LiamCfg, Provider);
return ProviderBase != null;
}
catch (Exception E)
{
LogException(E);
return false;
}
finally
{
LogMethodEnd(CM);
}
}
public override async Task<bool> LogonAsync()
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
try
{
if (ProviderBase == null)
if (!Load())
return false;
var RetVal = await ProviderBase.LogonAsync();
return RetVal;
}
catch (Exception E)
{
LogException(E);
return false;
}
finally
{
LogMethodEnd(CM);
}
}
public override async Task<List<TreeNodeBase>> ResolveAsync(bool ResolveAlways = false)
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
try
{
var lstLiamNodes = await ProviderBase.getDataAreasAsync(0);
if (lstLiamNodes == null)
return null;
var RetVal = new List<TreeNodeBase>();
foreach (var Entry in lstLiamNodes)
{
var Node = new TreeNodeLiamNode(Entry);
RetVal.Add(Node);
}
return RetVal;
}
catch (Exception E)
{
LogException(E);
return null;
}
finally
{
LogMethodEnd(CM);
}
}
}
public class TreeNodeLiamNode : TreeNodeBase
{
public cLiamDataAreaBase DataArea;
private bool privIsResolved = false;
private List<cLiamUserInfo> Owners = null;
public TreeNodeLiamNode(cLiamDataAreaBase DataArea)
{
this.DataArea = DataArea;
}
public override string ToString()
{
return DataArea?.TechnicalName ?? "";
}
public override int ImageIndex()
{
if (DataArea == null)
return iconIndexUnknown;
switch (DataArea.DataType)
{
case eLiamDataAreaTypes.MsTeamsTeam:
return 0;
case eLiamDataAreaTypes.MsTeamsChannel:
return 1;
case eLiamDataAreaTypes.MsTeamsFolder:
return 3;
default:
return iconIndexUnknown;
}
}
public override bool IsResolved()
{
return privIsResolved;
}
public override async Task<List<TreeNodeBase>> ResolveAsync(bool ResolveAlways = false)
{
if (DataArea == null)
return null;
Owners = await DataArea.GetOwnersAsync();
var Children = await DataArea.getChildrenAsync(0);
if (Children == null)
return null;
var RetVal = new List<TreeNodeBase>();
if (DataArea.SupportsPermissions)
RetVal.Add(new TreeNodeLiamPermissionList(DataArea));
foreach (var Entry in Children)
{
var Node = new TreeNodeLiamNode(Entry);
RetVal.Add(Node);
}
privIsResolved = true;
return RetVal;
}
public override string GetInfoText()
{
var RetVal = $"Technical name: {DataArea?.TechnicalName}";
RetVal += $"\r\n\r\nData type: {DataArea?.DataType}";
RetVal += $"\r\nUID: {DataArea?.UID}";
RetVal += $"\r\nParent UID: {DataArea?.ParentUID}";
RetVal += $"\r\n\r\nLevel: {DataArea?.Level}";
RetVal += $"\r\nSupport permissions: {DataArea?.SupportsPermissions}";
if (Owners != null)
{
if (Owners.Count == 0)
{
RetVal += $"\r\n\r\nOwner list is empty (no members)";
}
else
{
RetVal += $"\r\n\r\nOwners:";
foreach (var Owner in Owners)
{
RetVal += $"\r\n {Owner.DisplayName}: UPN='{Owner.UserPrincipalName}', SID='{Owner.SID}'";
}
}
}
return RetVal;
}
public override string GetUID()
{
return DataArea.UID;
}
public override async Task<TreeNodeBase> LoadFromUID()
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
try
{
var UID = GetUID();
if (string.IsNullOrEmpty(UID))
return null;
var R = await DataArea.Provider.LoadDataArea(UID);
if (R == null)
return null;
var RetVal = new TreeNodeLiamNode(R);
return RetVal;
}
catch (Exception E)
{
LogException(E);
return null;
}
finally
{
LogMethodEnd(CM);
}
}
}
public class TreeNodeLiamPermissionList : TreeNodeBase
{
public cLiamDataAreaBase DataArea;
private bool privIsResolved = false;
public TreeNodeLiamPermissionList(cLiamDataAreaBase DataArea)
{
this.DataArea = DataArea;
}
public override string GetInfoText()
{
return "";
}
public override string ToString()
{
return "Permissions";
}
public override bool IsResolved()
{
return privIsResolved;
}
override public async Task<List<TreeNodeBase>> ResolveAsync(bool ResolveAlways = false)
{
try
{
var RetVal = new List<TreeNodeBase>();
var Perms = await DataArea.GetPermissionsAsync(ResolveAlways);
if (Perms == null)
return null;
foreach (var Entry in Perms)
{
RetVal.Add(new TreeNodeLiamPermission(Entry, DataArea));
}
privIsResolved = true;
return RetVal;
}
catch (Exception E)
{
LogException(E);
}
finally
{
}
return null;
}
public override int ImageIndex()
{
return 4;
}
public override dynamic GetJsonObject()
{
return null;
}
public override bool SupportPermissionAdd()
{
return true;
}
public override bool SupportPermissionRemoveByValue()
{
return false;
}
public override async Task<bool> AddPermission(eLiamAccessRoles Role, string Identity)
{
try
{
var UserInfo = new cLiamUserInfo()
{
UserPrincipalName = Identity,
EMail = Identity
};
var PermResult = await DataArea.GrantPermissionAsync(UserInfo, Role);
if (PermResult.Valid)
return true;
}
catch (Exception E)
{
cLogManager.LogException(E);
}
return false;
}
public override async Task<bool> RemovePermissionByValue(eLiamAccessRoles Role, string Identity)
{
try
{
await Task.Delay(0);
}
catch (Exception E)
{
cLogManager.LogException(E);
}
return false;
}
public override List<eLiamAccessRoles> ValidPermissionRoles()
{
var RetVal = new List<eLiamAccessRoles>() {
eLiamAccessRoles.Read,
eLiamAccessRoles.Write,
eLiamAccessRoles.Owner
};
return RetVal;
}
public override string getLastError()
{
return "";
}
}
public class TreeNodeLiamPermission : TreeNodeBase
{
public cLiamPermissionInfo Permission = null;
public cLiamDataAreaBase DataArea = null;
public TreeNodeLiamPermission(cLiamPermissionInfo Permission, cLiamDataAreaBase DataArea) : base()
{
this.Permission = Permission;
this.DataArea = DataArea;
}
public override bool AutoResolved()
{
return true;
}
public override string GetInfoText()
{
if (Permission == null)
return "";
var strInfo = $"Type: Role memership";
var strUser = "-unknown-";
if (Permission.User != null)
{
if (Permission.User != null)
{
strUser = Permission.User.DisplayName;
if (string.IsNullOrEmpty(strUser))
strUser = Permission.User.UserPrincipalName;
if (string.IsNullOrEmpty(strUser))
strUser = Permission.User.EMail;
}
}
strInfo += $"\r\n\r\nUser or group: {strUser}";
strInfo += $"\r\n\r\nRole: {Permission.AccessRole}";
return strInfo;
}
public override string ToString()
{
try
{
if (Permission == null)
return "";
var strName = "Unknown";
if (Permission.User != null)
{
strName = Permission.User.DisplayName;
if (string.IsNullOrEmpty(strName))
strName = Permission.User.UserPrincipalName;
if (string.IsNullOrEmpty(strName))
strName = Permission.User.EMail;
}
strName += ": [" ;
var strRoles = Permission.AccessRole.ToString();
return strName + strRoles + "]";
}
catch (Exception E)
{
cLogManager.LogException(E);
}
return "";
}
public override bool IsResolved()
{
return true;
}
override public async Task<List<TreeNodeBase>> ResolveAsync(bool ResolveAlways = false)
{
await Task.Delay(0);
return new List<TreeNodeBase>();
}
public override int ImageIndex()
{
return 6;
}
public override dynamic GetJsonObject()
{
return null;
}
public override bool SupportPermissionRemoveDirect()
{
return true;
}
public override async Task<bool> RemovePermissionDirect()
{
try
{
if (Permission == null)
return false;
if (Permission.User == null)
return false;
var RetVal = await DataArea.RevokePermissionAsync(Permission.User, Permission.AccessRole);
return RetVal;
}
catch (Exception E)
{
cLogManager.LogException(E);
}
return false;
}
}
}

View File

@@ -0,0 +1,719 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using C4IT.Logging;
using C4IT.MsGraph;
using C4IT.LIAM;
using System.Reflection;
using static C4IT.Logging.cLogManager;
namespace LiamTestTeams
{
public class TreeNodeMsTeamsRoot : TreeNodeRoot
{
public cMsGraphSharepoint MsSharepoint;
public TreeNodeMsTeamsRoot(cLiamProviderData Provider) : base(Provider)
{
}
public override string ToString()
{
var s = MsSharepoint?.Base?.Me?.DisplayName;
return s ?? "";
}
public override string GetInfoText()
{
var s = MsSharepoint?.Base?.Me?.PublisherDomain;
return s ?? "";
}
public override async Task<bool> LogonAsync()
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
try
{
var MsGraph = new cMsGraphBase();
var LogonInfo = new cMsGraphLogonInfo()
{
Tenant = Provider.Domain,
ClientID = Provider.Credential.Identification,
ClientSecret = Provider.Credential.Secret
};
var isOk = await MsGraph.LogonAsync(LogonInfo);
if (!isOk)
return false;
MsSharepoint = new cMsGraphSharepoint(MsGraph);
return true;
}
catch (Exception E)
{
LogException(E);
return false;
}
finally
{
LogMethodEnd(CM);
}
}
public override async Task<List<TreeNodeBase>> ResolveAsync(bool ResolveAlways = false)
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
var RetVal = new List<TreeNodeBase>();
try
{
var lstTeams = await MsSharepoint.RequestTeamsListAsync();
if (lstTeams == null || lstTeams.Count == 0)
return RetVal;
foreach (var Entry in lstTeams.Values)
{
var Team = await MsSharepoint.RequestGroupInfoAsync(Entry);
if (Team == null)
continue;
var Node = new TreeNodeMsTeamsGroup(this, Team);
RetVal.Add(Node);
}
}
catch (Exception E)
{
LogException(E);
}
finally
{
LogMethodEnd(CM);
}
return RetVal;
}
public override string getLastError()
{
return MsSharepoint?.Base?.LastErrorMessage ?? "";
}
}
public class TreeNodeMsTeamsGroup : TreeNodeBase
{
public string ID;
public cMsGraphResultGroup Group = null;
public TreeNodeMsTeamsRoot Root;
public TreeNodeMsTeamsGroup(TreeNodeMsTeamsRoot Root, cMsGraphResultGroup MsGroup)
{
this.Root = Root;
this.ID = MsGroup.ID;
Group = MsGroup;
}
public override string ToString()
{
if (Group == null)
return "";
return Group.DisplayName;
}
public override bool IsResolved()
{
if (Group == null)
return false;
if (Group.Channels == null)
return false;
return true;
}
public override string GetInfoText()
{
if (Group == null)
return "";
var strInfo = "Type: Group";
strInfo += $"\r\n\r\nDisplay name: {Group.DisplayName}";
strInfo += $"\r\nDescription: {Group.Description}";
strInfo += $"\r\nVisibility: {Group.Visibility}";
strInfo += $"\r\n\r\nID: {Group.ID}";
strInfo += $"\r\nSID: {Group.SID}";
strInfo += $"\r\nMail enabled: {Group.MailEnabled}";
strInfo += $"\r\nMail address: {Group.MailAddress}";
if (Group.Drive != null)
{
strInfo += $"\r\n\r\nDrive name: {Group.Drive.DisplayName}";
strInfo += $"\r\nDrive type: {Group.Drive.DriveType}";
strInfo += $"\r\nDrive ID: {Group.Drive.ID}";
if (Group.Drive.Root != null)
{
strInfo += $"\r\n\r\nRoot name: {Group.Drive.Root.DisplayName}";
strInfo += $"\r\nRoot ID: {Group.Drive.Root.ID}";
}
}
return strInfo;
}
override public async Task<List<TreeNodeBase>> ResolveAsync(bool ResolveAlways = false)
{
if (Group == null || ResolveAlways)
Group = await Root.MsSharepoint.RequestGroupInfoAsync(ID);
if (Group == null)
return null;
if (Group.Drive == null)
if (!await Group.ResolveDrive(Root.MsSharepoint))
return null;
if (Group.Drive.Root == null)
if (!await Group.Drive.ResolveRoot(Root.MsSharepoint))
return null;
if (Group.Channels == null)
if (!await Group.ResolveChannels(Root.MsSharepoint))
return null;
if (Group.Drive.Root.Folders == null)
await Group.Drive.Root.ResolveFolders(Root.MsSharepoint);
var RetVal = new List<TreeNodeBase>(Group.Channels.Count);
foreach (var Entry in Group.Channels.Values)
{
var Item = new TreeNodeMsTeamsChannel(this, Entry);
RetVal.Add(Item);
}
return RetVal;
}
public override int ImageIndex()
{
return 0;
}
public override dynamic GetJsonObject()
{
return Group.Result; ;
}
public override string getLastError()
{
return Root?.MsSharepoint?.Base?.LastErrorMessage ?? "";
}
}
public class TreeNodeMsTeamsFolder : TreeNodeBase
{
public cMsGraphResultFileObject Folder = null;
public TreeNodeMsTeamsRoot Root;
public TreeNodeMsTeamsFolder(TreeNodeMsTeamsRoot Root, TreeNodeBase Parent, cMsGraphResultFileObject Folder)
{
this.Root = Root;
this.Parent = Parent;
this.Folder = Folder;
}
public override string ToString()
{
if (Folder == null)
return "";
return Folder.DisplayName;
}
public override bool IsResolved()
{
if (Folder != null && Folder.Folders != null)
return true;
return false;
}
public override string GetInfoText()
{
if (Folder == null)
return "";
var strInfo = $"Type: Folder";
strInfo += $"\r\n\r\nDisplay name: {Folder.DisplayName}";
strInfo += $"\r\nIs folder: {Folder.IsFolder}";
strInfo += $"\r\n\r\nID: {Folder.ID}";
return strInfo;
}
override public async Task<List<TreeNodeBase>> ResolveAsync(bool ResolveAlways = false)
{
try
{
if (Folder == null)
return null;
if (string.IsNullOrEmpty(Folder.Context) || ResolveAlways)
{
var Folder2 = await Root.MsSharepoint.RequestFileObjectInfo(Folder.DriveID, Folder.ID, Folder.Drive);
if (Folder2 != null)
Folder = Folder2;
}
if (Folder.Folders == null)
if (!await Folder.ResolveFolders(Root.MsSharepoint))
return null;
var RetVal = new List<TreeNodeBase>()
{
new TreeNodeMsTeamsPermissionList(Root, this, this.Folder)
};
foreach (var Entry in Folder.Folders.Values)
{
var Item = new TreeNodeMsTeamsFolder(Root, this, Entry);
RetVal.Add(Item);
}
return RetVal;
}
catch (Exception E)
{
cLogManager.LogException(E);
}
return null;
}
public override int ImageIndex()
{
return 3;
}
public override dynamic GetJsonObject()
{
return Folder.Result; ;
}
public override string getLastError()
{
return Root?.MsSharepoint?.Base?.LastErrorMessage ?? "";
}
}
public class TreeNodeMsTeamsChannel : TreeNodeBase
{
public cMsGraphResultChannel Channel = null;
public TreeNodeMsTeamsRoot Root;
public TreeNodeMsTeamsChannel(TreeNodeMsTeamsGroup Group, cMsGraphResultChannel Channel) : base()
{
this.Root = Group.Root;
this.Parent = Group;
this.Channel = Channel;
}
public override string GetInfoText()
{
if (Channel == null)
return "";
var strInfo = $"Type: Channel";
strInfo += $"\r\n\r\nDisplay name: {Channel.DisplayName}";
var hasRootFolder = Channel.RootFolder != null;
strInfo += $"\r\nHas root folder: {hasRootFolder}";
strInfo += $"\r\n\r\nID: {Channel.ID}";
return strInfo;
}
public override string ToString()
{
if (Channel == null)
return "";
return Channel.DisplayName;
}
public override bool IsResolved()
{
if (Channel != null && Channel.RootFolderResolved)
return true;
return false;
}
override public async Task<List<TreeNodeBase>> ResolveAsync(bool ResolveAlways = false)
{
if (Channel == null)
return null;
if (Channel.RootFolder == null || ResolveAlways)
if (!await Channel.ResolveRootFolder(Root.MsSharepoint))
return new List<TreeNodeBase>();
if (Channel.RootFolder.Folders == null || ResolveAlways)
if (!await Channel.RootFolder.ResolveFolders(Root.MsSharepoint))
return new List<TreeNodeBase>();
var RetVal = new List<TreeNodeBase>(Channel.RootFolder.Folders.Count)
{
new TreeNodeMsTeamsPermissionList(Root, this, Channel.RootFolder)
};
foreach (var Entry in Channel.RootFolder.Folders.Values)
{
var Item = new TreeNodeMsTeamsFolder(Root, this, Entry);
RetVal.Add(Item);
}
return RetVal;
}
public override int ImageIndex()
{
if (Channel != null)
if (Channel.RootFolder != null)
return 2;
return 1;
}
public override dynamic GetJsonObject()
{
return Channel.Result; ;
}
public override string getLastError()
{
return Root?.MsSharepoint?.Base?.LastErrorMessage ?? "";
}
}
public class TreeNodeMsTeamsPermissionList : TreeNodeBase
{
public cMsGraphResultFileObject Folder = null;
public TreeNodeMsTeamsRoot Root;
public TreeNodeMsTeamsPermissionList(TreeNodeMsTeamsRoot Root, TreeNodeBase Parent, cMsGraphResultFileObject Folder) : base()
{
this.Root = Root;
this.Parent = Parent;
this.Folder = Folder;
}
public override string GetInfoText()
{
return "";
}
public override string ToString()
{
return "Permissions";
}
public override bool IsResolved()
{
if (Folder != null && Folder.Permissions != null)
return true;
return false;
}
override public async Task<List<TreeNodeBase>> ResolveAsync(bool ResolveAlways = false)
{
var RetVal = new List<TreeNodeBase>();
if (Folder.Permissions == null || ResolveAlways)
await Folder.ResolvePermissions(Root.MsSharepoint);
if (Folder.Permissions != null)
foreach (var Entry in Folder.Permissions)
{
if (Entry.Identities == null || Entry.Identities.Count == 0)
{
var Item = new TreeNodeMsTeamsPermission(this, Entry, null);
RetVal.Add(Item);
}
else
{
foreach (var Identity in Entry.Identities)
{
var Item = new TreeNodeMsTeamsPermission(this, Entry, Identity);
RetVal.Add(Item);
}
}
}
return RetVal;
}
public override int ImageIndex()
{
return 4;
}
public override dynamic GetJsonObject()
{
return "";
}
public override bool SupportPermissionAdd()
{
if (Parent is TreeNodeMsTeamsFolder Fo)
if (Fo.Folder != null)
return true;
return false;
}
public override bool SupportPermissionRemoveByValue()
{
return true;
}
public override async Task<bool> AddPermission(eLiamAccessRoles Role, string Identity)
{
try
{
var MsGraphRole = cLiamProviderMsTeams.getMsGraphRole(Role);
if (this.Parent is TreeNodeMsTeamsFolder Fo)
if (Fo.Folder != null)
{
var Roles = new List<cMsGraphResultPermission.ePermissionRole>()
{
MsGraphRole
};
var RetVal = await Fo.Folder.AddPermission(Root.MsSharepoint, Roles, cMsGraphResultPermission.eDriveReceipientType.email, Identity);
if (RetVal != null)
return true;
}
}
catch (Exception E)
{
cLogManager.LogException(E);
}
return false;
}
public override async Task<bool> RemovePermissionByValue(eLiamAccessRoles Role, string Identity)
{
try
{
var MsGraphRole = cLiamProviderMsTeams.getMsGraphRole(Role);
if (this.Parent is TreeNodeMsTeamsFolder Fo)
if (Fo.Folder != null)
{
var RetVal = await Fo.Folder.RemovePermission(Root.MsSharepoint, MsGraphRole, Identity);
return RetVal;
}
}
catch (Exception E)
{
cLogManager.LogException(E);
}
return false;
}
public override List<eLiamAccessRoles> ValidPermissionRoles()
{
var RetVal = new List<eLiamAccessRoles>() {
eLiamAccessRoles.Read,
eLiamAccessRoles.Write
};
return RetVal;
}
public override string getLastError()
{
return Root?.MsSharepoint?.Base?.LastErrorMessage ?? "";
}
}
public class TreeNodeMsTeamsPermission : TreeNodeBase
{
public cMsGraphResultPermission Permission = null;
public cMsGraphResultPermission.cMsGraphPermissionIdentity Identity = null;
public TreeNodeMsTeamsRoot Root;
public TreeNodeMsTeamsPermission(TreeNodeMsTeamsPermissionList Folder, cMsGraphResultPermission Permission, cMsGraphResultPermission.cMsGraphPermissionIdentity Identity) : base()
{
this.Root = Folder.Root;
this.Parent = Folder;
this.Permission = Permission;
this.Identity = Identity;
}
public override bool AutoResolved()
{
return true;
}
public override string GetInfoText()
{
if (Permission == null)
return "";
var strInfo = $"Type: Permission (-unknown-)";
if (Permission is cMsGraphResultPermission.PermissionDirect)
strInfo = $"Type: Permission (direkt)";
else if (Permission is cMsGraphResultPermission.PermissionLink Link)
{
strInfo = $"Type: Permission (link)";
strInfo += $"\r\n\r\nScope: {Link?.Scope ?? ""}";
strInfo += $"\r\nPrevents download: {Link?.PreventsDownload ?? ""}";
strInfo += $"\r\nWEB URL: {Link?.WebUrl ?? ""}";
}
strInfo += $"\r\n\r\nPermission ID: {Permission?.ID ?? ""}";
strInfo += $"\r\nIs inherited: {Permission?.isInherited.ToString() ?? ""}";
var strRoles = "";
if (Permission.Roles != null)
foreach (var Entry in Permission.Roles)
{
if (strRoles != "")
strRoles += "";
strRoles += Entry;
}
strInfo += $"\r\n\r\nRoles: {strRoles}";
if (Identity == null)
{
strInfo += $"\r\n\r\nNo identities assigned";
}
else
{
var strType = "-unknown-";
switch (Identity?.IdentityType)
{
case cMsGraphResultPermission.cMsGraphPermissionIdentity.eIdentityType.application:
strType = "Application";
break;
case cMsGraphResultPermission.cMsGraphPermissionIdentity.eIdentityType.device:
strType = "Device";
break;
case cMsGraphResultPermission.cMsGraphPermissionIdentity.eIdentityType.user:
strType = "User or group";
break;
}
strInfo += $"\r\n\r\nIdentity type: {strType}";
strInfo += $"\r\nIdentity name: {Identity?.DisplayName ?? ""}";
strInfo += $"\r\nIdentity email: {Identity?.EMail ?? ""}";
strInfo += $"\r\nIdentity ID: {Identity?.ID ?? ""}";
}
return strInfo;
}
public override string ToString()
{
try
{
if (Permission == null)
return "";
var strName = "Unknown:";
if (Permission is cMsGraphResultPermission.PermissionDirect)
strName = "Direct: ";
else if (Permission is cMsGraphResultPermission.PermissionLink)
strName = "Link: ";
strName += $" {Identity?.DisplayName ?? "(no identities)"} =";
var strRoles = "";
if (Permission.Roles != null)
foreach (var Entry in Permission.Roles)
strRoles += " " + Entry;
return strName + strRoles;
}
catch (Exception E)
{
cLogManager.LogException(E);
}
return "";
}
public override bool IsResolved()
{
return true;
}
override public async Task<List<TreeNodeBase>> ResolveAsync(bool ResolveAlways = false)
{
await Task.Delay(0);
return new List<TreeNodeBase>();
}
public override int ImageIndex()
{
if (Permission.isInherited)
return 5;
return 6;
}
public override dynamic GetJsonObject()
{
return Permission.Result;
}
public override bool SupportPermissionRemoveDirect()
{
return true;
}
public override async Task<bool> RemovePermissionDirect()
{
try
{
if (Permission == null)
return false;
if (Identity == null)
{
var rv = await Permission.Delete(Root.MsSharepoint);
return rv;
}
var RT = cMsGraphResultPermission.eDriveReceipientType.email;
var RN = Identity?.EMail;
if (!string.IsNullOrEmpty(Identity.ID))
{
RT = cMsGraphResultPermission.eDriveReceipientType.objectId;
RN = Identity.ID;
}
var RetVal = await Permission.RevokeGrant(Root.MsSharepoint, RT, RN);
return RetVal;
}
catch (Exception E)
{
cLogManager.LogException(E);
}
return false;
}
public override string getLastError()
{
return Root?.MsSharepoint?.Base?.LastErrorMessage ?? "";
}
}
}

26
LiamTestTeams/Program.cs Normal file
View File

@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using C4IT.Logging;
namespace LiamTestTeams
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
cLogManagerFile.CreateInstance(cLogManagerFile.GetDefaultPath(false, SubFolder: "logs"));
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmMain());
}
}
}

View File

@@ -0,0 +1,11 @@
using System.Reflection;
using System.Runtime.InteropServices;
[assembly: AssemblyTitle("LIAM Testing for MS Teams & Sharepoint")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: Guid("6197c490-07c6-4313-8e0f-aadc27776473")]

View File

@@ -0,0 +1,70 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace LiamTestTeams.Properties
{
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("LiamTestTeams.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}

View File

@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,29 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace LiamTestTeams.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
}

View File

@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.1" newVersion="5.0.0.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Graph.Core" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.24.0.0" newVersion="1.24.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Identity.Client" publicKeyToken="0a613f4dd989e8ae" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.27.0.0" newVersion="4.27.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.1" newVersion="5.0.0.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Graph.Core" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.24.0.0" newVersion="1.24.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Identity.Client" publicKeyToken="0a613f4dd989e8ae" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.27.0.0" newVersion="4.27.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using C4IT.Configuration;
using C4IT.Security;
namespace LiamTestTeams
{
public class cLiamTestTeamsConfig
{
public const string constRegPathConfig = @"Software\Consulting4IT GmbH\LIAM\LiamTestTeams";
[RegConfig]
public string Tenant = "";
[RegConfig]
public string ClientAppID = "";
[RegConfig]
public string ClientSecret = "";
public void Save(string Property = null)
{
cConfigRegistryHelper.Save(constRegPathConfig, this, Property);
}
public void Load()
{
cConfigRegistryHelper.Load(constRegPathConfig, this, true);
}
}
}

251
LiamTestTeams/ctrlTabLiam.Designer.cs generated Normal file
View File

@@ -0,0 +1,251 @@
namespace LiamTestTeams
{
partial class ctrlTabLiam
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ctrlTabLiam));
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.treeViewTeams = new System.Windows.Forms.TreeView();
this.contextMenuStripTreeNode = new System.Windows.Forms.ContextMenuStrip(this.components);
this.ToolStripMenuItemRefresh = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItemGetJson = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripMenuItemAddPermission = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItemRemovePermission = new System.Windows.Forms.ToolStripMenuItem();
this.imageList1 = new System.Windows.Forms.ImageList(this.components);
this.labelTitel = new System.Windows.Forms.Label();
this.textBoxErrorMessage = new System.Windows.Forms.TextBox();
this.textBoxDetails = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripMenuItemLoadFromUID = new System.Windows.Forms.ToolStripMenuItem();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
this.splitContainer1.SuspendLayout();
this.contextMenuStripTreeNode.SuspendLayout();
this.SuspendLayout();
//
// splitContainer1
//
this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainer1.Location = new System.Drawing.Point(0, 0);
this.splitContainer1.Name = "splitContainer1";
//
// splitContainer1.Panel1
//
this.splitContainer1.Panel1.Controls.Add(this.treeViewTeams);
this.splitContainer1.Panel1.Controls.Add(this.labelTitel);
//
// splitContainer1.Panel2
//
this.splitContainer1.Panel2.Controls.Add(this.textBoxErrorMessage);
this.splitContainer1.Panel2.Controls.Add(this.textBoxDetails);
this.splitContainer1.Panel2.Controls.Add(this.label2);
this.splitContainer1.Size = new System.Drawing.Size(556, 293);
this.splitContainer1.SplitterDistance = 276;
this.splitContainer1.TabIndex = 0;
//
// treeViewTeams
//
this.treeViewTeams.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.treeViewTeams.ContextMenuStrip = this.contextMenuStripTreeNode;
this.treeViewTeams.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.treeViewTeams.FullRowSelect = true;
this.treeViewTeams.HideSelection = false;
this.treeViewTeams.ImageIndex = 0;
this.treeViewTeams.ImageList = this.imageList1;
this.treeViewTeams.Location = new System.Drawing.Point(3, 26);
this.treeViewTeams.Name = "treeViewTeams";
this.treeViewTeams.SelectedImageIndex = 0;
this.treeViewTeams.Size = new System.Drawing.Size(270, 264);
this.treeViewTeams.TabIndex = 1;
this.treeViewTeams.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViewTeams_AfterSelect);
//
// contextMenuStripTreeNode
//
this.contextMenuStripTreeNode.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.ToolStripMenuItemRefresh,
this.toolStripMenuItemGetJson,
this.toolStripSeparator1,
this.toolStripMenuItemAddPermission,
this.toolStripMenuItemRemovePermission,
this.toolStripSeparator2,
this.toolStripMenuItemLoadFromUID});
this.contextMenuStripTreeNode.Name = "contextMenuStripTreeNode";
this.contextMenuStripTreeNode.Size = new System.Drawing.Size(181, 148);
//
// ToolStripMenuItemRefresh
//
this.ToolStripMenuItemRefresh.Name = "ToolStripMenuItemRefresh";
this.ToolStripMenuItemRefresh.Size = new System.Drawing.Size(180, 22);
this.ToolStripMenuItemRefresh.Text = "Refresh";
this.ToolStripMenuItemRefresh.Click += new System.EventHandler(this.ToolStripMenuItemRefresh_Click);
//
// toolStripMenuItemGetJson
//
this.toolStripMenuItemGetJson.Name = "toolStripMenuItemGetJson";
this.toolStripMenuItemGetJson.Size = new System.Drawing.Size(180, 22);
this.toolStripMenuItemGetJson.Text = "Get json string";
this.toolStripMenuItemGetJson.Click += new System.EventHandler(this.toolStripMenuItemGetJson_Click);
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(177, 6);
//
// toolStripMenuItemAddPermission
//
this.toolStripMenuItemAddPermission.Enabled = false;
this.toolStripMenuItemAddPermission.Name = "toolStripMenuItemAddPermission";
this.toolStripMenuItemAddPermission.Size = new System.Drawing.Size(180, 22);
this.toolStripMenuItemAddPermission.Text = "Add permission";
this.toolStripMenuItemAddPermission.Click += new System.EventHandler(this.toolStripMenuItemAddPermission_Click);
//
// toolStripMenuItemRemovePermission
//
this.toolStripMenuItemRemovePermission.Enabled = false;
this.toolStripMenuItemRemovePermission.Name = "toolStripMenuItemRemovePermission";
this.toolStripMenuItemRemovePermission.Size = new System.Drawing.Size(180, 22);
this.toolStripMenuItemRemovePermission.Text = "Remove permission";
this.toolStripMenuItemRemovePermission.Click += new System.EventHandler(this.toolStripMenuItemRemovePermission_Click);
//
// imageList1
//
this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
this.imageList1.TransparentColor = System.Drawing.Color.Transparent;
this.imageList1.Images.SetKeyName(0, "Team_32.png");
this.imageList1.Images.SetKeyName(1, "Channel_32.png");
this.imageList1.Images.SetKeyName(2, "ChannelFolder_32.png");
this.imageList1.Images.SetKeyName(3, "Folder_32.png");
this.imageList1.Images.SetKeyName(4, "permission_32.png");
this.imageList1.Images.SetKeyName(5, "permission2_32.png");
this.imageList1.Images.SetKeyName(6, "permission3_32.png");
this.imageList1.Images.SetKeyName(7, "Error_32.png");
this.imageList1.Images.SetKeyName(8, "Unknown_32.png");
//
// labelTitel
//
this.labelTitel.AutoSize = true;
this.labelTitel.Location = new System.Drawing.Point(3, 10);
this.labelTitel.Name = "labelTitel";
this.labelTitel.Size = new System.Drawing.Size(61, 13);
this.labelTitel.TabIndex = 0;
this.labelTitel.Text = "MS Teams:";
//
// textBoxErrorMessage
//
this.textBoxErrorMessage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.textBoxErrorMessage.ForeColor = System.Drawing.Color.Maroon;
this.textBoxErrorMessage.Location = new System.Drawing.Point(6, 209);
this.textBoxErrorMessage.Multiline = true;
this.textBoxErrorMessage.Name = "textBoxErrorMessage";
this.textBoxErrorMessage.ReadOnly = true;
this.textBoxErrorMessage.Size = new System.Drawing.Size(267, 81);
this.textBoxErrorMessage.TabIndex = 2;
this.textBoxErrorMessage.Visible = false;
//
// textBoxDetails
//
this.textBoxDetails.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.textBoxDetails.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.textBoxDetails.Location = new System.Drawing.Point(6, 26);
this.textBoxDetails.Multiline = true;
this.textBoxDetails.Name = "textBoxDetails";
this.textBoxDetails.ReadOnly = true;
this.textBoxDetails.ScrollBars = System.Windows.Forms.ScrollBars.Both;
this.textBoxDetails.Size = new System.Drawing.Size(267, 264);
this.textBoxDetails.TabIndex = 1;
this.textBoxDetails.WordWrap = false;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(3, 10);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(42, 13);
this.label2.TabIndex = 0;
this.label2.Text = "Details:";
//
// toolStripSeparator2
//
this.toolStripSeparator2.Name = "toolStripSeparator2";
this.toolStripSeparator2.Size = new System.Drawing.Size(177, 6);
//
// toolStripMenuItemLoadFromUID
//
this.toolStripMenuItemLoadFromUID.Enabled = false;
this.toolStripMenuItemLoadFromUID.Name = "toolStripMenuItemLoadFromUID";
this.toolStripMenuItemLoadFromUID.Size = new System.Drawing.Size(180, 22);
this.toolStripMenuItemLoadFromUID.Text = "Try load from UID";
this.toolStripMenuItemLoadFromUID.Click += new System.EventHandler(this.toolStripMenuItemLoadFromUID_Click);
//
// ctrlTabLiam
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.splitContainer1);
this.Name = "ctrlTabLiam";
this.Size = new System.Drawing.Size(556, 293);
this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel1.PerformLayout();
this.splitContainer1.Panel2.ResumeLayout(false);
this.splitContainer1.Panel2.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
this.splitContainer1.ResumeLayout(false);
this.contextMenuStripTreeNode.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.SplitContainer splitContainer1;
private System.Windows.Forms.TreeView treeViewTeams;
private System.Windows.Forms.Label labelTitel;
private System.Windows.Forms.TextBox textBoxDetails;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.ImageList imageList1;
private System.Windows.Forms.ContextMenuStrip contextMenuStripTreeNode;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemGetJson;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemAddPermission;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemRemovePermission;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItemRefresh;
private System.Windows.Forms.TextBox textBoxErrorMessage;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemLoadFromUID;
}
}

View File

@@ -0,0 +1,457 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using Newtonsoft.Json;
using C4IT.Logging;
using C4IT.LIAM;
using System.Reflection;
using static C4IT.Logging.cLogManager;
namespace LiamTestTeams
{
public partial class ctrlTabLiam : UserControl
{
public ctrlTabLiam()
{
InitializeComponent();
}
public void SetTitle(string Title)
{
labelTitel.Text = Title;
}
public async Task Refresh(TreeNodeRoot RootNode)
{
treeViewTeams.Nodes.Clear();
var listGroups = await RootNode.ResolveAsync();
ShowErrorMessage(RootNode.getLastError());
if (listGroups == null)
return;
foreach (var Entry in listGroups)
{
var tr = new TreeNode(Entry.ToString())
{
ImageIndex = Entry.ImageIndex(),
SelectedImageIndex = Entry.ImageIndex(),
Tag = Entry,
ForeColor = Color.Gray,
};
treeViewTeams.Nodes.Add(tr);
}
}
private async void treeViewTeams_AfterSelect(object sender, TreeViewEventArgs e)
{
if (treeViewTeams.SelectedNode == null && treeViewTeams.SelectedNode.Tag == null)
{
textBoxDetails.Text = "";
return;
}
var tag = treeViewTeams.SelectedNode.Tag;
if (tag is TreeNodeBase NodeInfo)
{
if (NodeInfo.SupportPermissionAdd())
toolStripMenuItemAddPermission.Enabled = true;
else
toolStripMenuItemAddPermission.Enabled = false;
if (NodeInfo.SupportPermissionRemoveDirect() || NodeInfo.SupportPermissionRemoveByValue())
toolStripMenuItemRemovePermission.Enabled = true;
else
toolStripMenuItemRemovePermission.Enabled = false;
if (NodeInfo.GetUID() != null)
toolStripMenuItemLoadFromUID.Enabled = true;
else
toolStripMenuItemLoadFromUID.Enabled = false;
if (NodeInfo.IsResolved())
{
textBoxDetails.Text = NodeInfo.GetInfoText();
return;
}
Cursor = Cursors.WaitCursor;
treeViewTeams.Enabled = false;
try
{
await UpdateNode(treeViewTeams.SelectedNode, false);
}
catch { };
treeViewTeams.Enabled = true;
Cursor = Cursors.Default;
}
}
private async Task UpdateNode(TreeNode Node, bool ResolveAlways)
{
try
{
Node.Nodes.Clear();
if (!(Node.Tag is TreeNodeBase NodeInfo))
{
Node.Text = "- Error -";
Node.ImageIndex = 7;
Node.SelectedImageIndex = 7;
return;
}
var SubItems = await NodeInfo.ResolveAsync(ResolveAlways);
ShowErrorMessage(NodeInfo.getLastError());
textBoxDetails.Text = NodeInfo.GetInfoText();
if (SubItems != null)
{
Node.ImageIndex = NodeInfo.ImageIndex();
Node.SelectedImageIndex = Node.ImageIndex;
treeViewTeams.BeginUpdate();
try
{
foreach (var Entry in SubItems)
{
var tr = new TreeNode(Entry.ToString())
{
Tag = Entry,
ImageIndex = Entry.ImageIndex(),
SelectedImageIndex = Entry.ImageIndex()
};
if (Entry.AutoResolved())
tr.ForeColor = Color.Black;
else
tr.ForeColor = Color.Gray;
treeViewTeams.SelectedNode.Nodes.Add(tr);
}
treeViewTeams.SelectedNode.Expand();
treeViewTeams.SelectedNode.ForeColor = Color.Black;
}
catch (Exception E)
{
cLogManager.LogException(E);
}
finally
{
treeViewTeams.EndUpdate();
}
}
else
{
Node.ImageIndex = 7;
Node.SelectedImageIndex = 7;
}
}
catch (Exception E)
{
cLogManager.LogException(E);
Node.ImageIndex = 7;
Node.SelectedImageIndex = 7;
}
}
private void toolStripMenuItemGetJson_Click(object sender, EventArgs e)
{
try
{
if (treeViewTeams.SelectedNode == null)
return;
if (!(treeViewTeams.SelectedNode.Tag is TreeNodeBase tn))
return;
var strJson = tn.GetJson();
if (string.IsNullOrWhiteSpace(strJson))
return;
var FN = Path.GetTempPath();
FN = Path.Combine(FN, "LiamTestTeams");
Directory.CreateDirectory(FN);
var FN2 = cLogManagerFile.BuildFileName(treeViewTeams.SelectedNode.Text) + ".json";
FN = Path.Combine(FN, FN2);
File.WriteAllText(FN, strJson);
var strEditor = Environment.ExpandEnvironmentVariables(@"%ProgramFiles%\Notepad++\notepad++.exe");
if (!File.Exists(strEditor))
strEditor = Environment.ExpandEnvironmentVariables(@"%ProgramFiles(x86)%\Notepad++\notepad++.exe");
if (!File.Exists(strEditor))
strEditor = Environment.ExpandEnvironmentVariables(@"%windir%\notepad.exe");
var PI = new ProcessStartInfo()
{
FileName = strEditor,
Arguments = "\"" + FN + "\"",
UseShellExecute = false
};
Process.Start(PI);
}
catch (Exception E)
{
cLogManager.LogException(E);
}
}
private async void ToolStripMenuItemRefresh_Click(object sender, EventArgs e)
{
try
{
if (treeViewTeams.SelectedNode == null)
return;
if (!(treeViewTeams.SelectedNode.Tag is TreeNodeBase tn))
return;
Cursor = Cursors.WaitCursor;
treeViewTeams.Enabled = false;
await UpdateNode(treeViewTeams.SelectedNode, true);
}
catch (Exception E)
{
cLogManager.LogException(E);
}
finally
{
treeViewTeams.Enabled = true;
Cursor = Cursors.Default;
}
}
private async void toolStripMenuItemAddPermission_Click(object sender, EventArgs e)
{
try
{
if (treeViewTeams.SelectedNode == null)
return;
if (!(treeViewTeams.SelectedNode.Tag is TreeNodeBase tn))
return;
if (!tn.SupportPermissionAdd())
return;
var ValidRoles = tn.ValidPermissionRoles();
if (ValidRoles == null || ValidRoles.Count == 0)
return;
var dlgInput = new frmPermissionInput();
dlgInput.comboBoxRole.Items.Clear();
foreach (var Entry in ValidRoles)
dlgInput.comboBoxRole.Items.Add(Entry);
var Retval = dlgInput.ShowDialog();
if (Retval != DialogResult.OK)
return;
var User = dlgInput.textBoxEmail.Text.Trim();
eLiamAccessRoles Role;
switch (dlgInput.comboBoxRole.SelectedIndex)
{
case 0:
Role = eLiamAccessRoles.Read;
break;
case 1:
Role = eLiamAccessRoles.Write;
break;
case 2:
Role = eLiamAccessRoles.Owner;
break;
default:
return;
}
Cursor = Cursors.WaitCursor;
treeViewTeams.Enabled = false;
await tn.AddPermission(Role, User);
var LastMessage = tn.getLastError();
await Task.Delay(100);
await UpdateNode(treeViewTeams.SelectedNode, true);
if (!string.IsNullOrEmpty(LastMessage))
ShowErrorMessage(LastMessage);
}
catch (Exception E)
{
cLogManager.LogException(E);
}
finally
{
treeViewTeams.Enabled = true;
Cursor = Cursors.Default;
}
}
private async void toolStripMenuItemRemovePermission_Click(object sender, EventArgs e)
{
try
{
if (treeViewTeams.SelectedNode == null)
return;
if (!(treeViewTeams.SelectedNode.Tag is TreeNodeBase tn))
return;
if (tn.SupportPermissionRemoveDirect())
{
Cursor = Cursors.WaitCursor;
treeViewTeams.Enabled = false;
await tn.RemovePermissionDirect();
var LastMessage2 = tn.getLastError();
await Task.Delay(100);
await UpdateNode(treeViewTeams.SelectedNode.Parent, true);
if (!string.IsNullOrEmpty(LastMessage2))
ShowErrorMessage(LastMessage2);
return;
}
if (!tn.SupportPermissionRemoveByValue())
return;
var ValidRoles = tn.ValidPermissionRoles();
if (ValidRoles == null || ValidRoles.Count == 0)
return;
var dlgInput = new frmPermissionInput();
dlgInput.comboBoxRole.Items.Clear();
foreach (var Entry in ValidRoles)
dlgInput.comboBoxRole.Items.Add(Entry);
var Retval = dlgInput.ShowDialog();
if (Retval != DialogResult.OK)
return;
var User = dlgInput.textBoxEmail.Text.Trim();
eLiamAccessRoles Role;
switch (dlgInput.comboBoxRole.SelectedIndex)
{
case 0:
Role = eLiamAccessRoles.Read;
break;
case 1:
Role = eLiamAccessRoles.Write;
break;
default:
return;
}
Cursor = Cursors.WaitCursor;
treeViewTeams.Enabled = false;
await tn.RemovePermissionByValue(Role, User);
var LastMessage = tn.getLastError();
await Task.Delay(100);
await UpdateNode(treeViewTeams.SelectedNode, true);
if (!string.IsNullOrEmpty(LastMessage))
ShowErrorMessage(LastMessage);
return;
}
catch (Exception E)
{
cLogManager.LogException(E);
}
finally
{
treeViewTeams.Enabled = true;
Cursor = Cursors.Default;
}
}
public void ShowErrorMessage(string Message)
{
Invoke(new MethodInvoker(() => {
if (string.IsNullOrWhiteSpace(Message))
{
textBoxErrorMessage.Text = "";
textBoxErrorMessage.Visible = false;
textBoxDetails.Height = textBoxErrorMessage.Bottom - textBoxDetails.Top;
}
else
{
textBoxErrorMessage.Text = Message;
textBoxErrorMessage.Visible = true;
textBoxDetails.Height = textBoxErrorMessage.Top - textBoxDetails.Top - 1;
}
}));
}
private async void toolStripMenuItemLoadFromUID_Click(object sender, EventArgs e)
{
var CM = MethodBase.GetCurrentMethod();
LogMethodBegin(CM);
try
{
if (treeViewTeams.SelectedNode == null)
return;
if (!(treeViewTeams.SelectedNode.Tag is TreeNodeBase tn))
return;
var myUID = tn.GetUID();
if (myUID != null)
{
var N = await tn.LoadFromUID();
if (N != null && N.GetUID() == myUID)
{
var IT = N.GetInfoText();
var childs = await N.ResolveAsync(true);
if (childs != null)
IT += $"\r\n\r\nchild count: {childs.Count}";
else
IT += $"\r\n\r\n*** Error resolving child nodes ***";
MessageBox.Show(this, IT, $"Result for '{N.ToString()}'", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
MessageBox.Show(this, "Error loading node from UID", $"UID = {myUID}", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (Exception E)
{
LogException(E);
}
finally
{
LogMethodEnd(CM);
}
}
}
}

View File

@@ -0,0 +1,519 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="contextMenuStripTreeNode.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>127, 17</value>
</metadata>
<metadata name="imageList1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<data name="imageList1.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABi
WgAAAk1TRnQBSQFMAgEBCQEAAYABAAGAAQABIAEAASABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAGA
AwABYAMAAQEBAAEYBgABkP8AsQAD/QHmAeUB4gG+AboBsgGVAY4BgAF3AW8BWwFlAVsBRQFlAVsBRQF3
AW8BWwGVAY4BgAG+AboBsgHmAeUB4gP9/wBXAAP7AcoBxgHBAXUBbAFZAWQBWgFEAWQBWgFEAWQBWgFE
AWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAXUBbAFaAcoBxgHBA/v/AE4A
Ad8B3gHaAXcBbwFbAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFE
AWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAXcBbwFbAeAB3gHb/wBFAAP+AboBtgGu
AWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFE
AWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAboBtgGuA/7/ADwA
A/4BsgGsAaEBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFa
AUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFa
AUQBZAFaAUQBrAGoAZ0D/v8AOQABxQHBAbgBegFuAVQBbwFkAUwBZAFaAUQBZAFaAUQBZAFaAUQBZAFa
AUQBZAFaAUQBZAFaAUQBZAFaAUQBeAFvAVwBoQGbAY0BmgGTAYQBawFhAUwBZAFaAUQBZAFaAUQBZAFa
AUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBugG2Aa7/ADYAAeUB5AHhAXoBbgFU
AXoBbgFUAXoBbgFUAW8BZAFMAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAX0BdQFjAekB5wHk
Ae8B7QHrAe8B7QHrAdYB0wHNAWcBXQFIAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFE
AWQBWgFEAWQBWgFEAWQBWgFEAeAB3gHb/wAwAAP8AYwBggFsAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFU
AW8BZAFMAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAasBpQGZAe8B7QHrAe8B7QHrAe8B7QHrAe8B7QHr
AYIBeQFoAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFE
AXcBbwFbA/v/AC0AAdIBzwHIAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAW8BZAFM
AWQBWgFEAWQBWgFEAWQBWgFEAZUBjgF/Ae8B7QHrAe8B7QHrAe8B7QHrAeoB6AHlAXABZwFTAWQBWgFE
AWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAcoBxgHB
/wAqAAP+AYsBgQFrAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAW8BZAFM
AWQBWgFEAWQBWgFEAWQBWgFEAaQBngGRAdMBzwHJAcwByAHBAYkBgQFxAWQBWgFEAWQBWgFEAWQBWgFE
AWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAXUBbAFaA/3/ACcA
AeoB6QHnAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFU
AW8BZAFMAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFE
AWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAeYB5QHi
/wAnAAHIAcQBvAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6
AW4BVAF6AW4BVAFvAWQBTAFkAVsBRQGlAZ8BkgGlAZ8BkgGlAZ8BkgGOAYcBdwFkAVoBRAFkAVoBRAFk
AVoBRAFkAVoBRAFkAVoBRAFkAVoBRAFkAVoBRAFkAVoBRAFkAVoBRAFkAVoBRAFkAVoBRAFkAVoBRAG+
AboBsv8AJwABpwGfAY8BegFuAVQBegFuAVQBegFuAVQBegFuAVQBegFuAVQBegFuAVQBegFuAVQBegFu
AVQBegFuAVQBegFuAVQBegFuAVQBbwFkAUwB7QHqAegB7wHtAesB7wHtAesBzAHIAcEBZAFaAUQBZAFa
AUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFa
AUQBlQGOAYD/ACcAAYwBggFsAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFU
AXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAeMB4AHbAe8B7QHrAe8B7QHrAewB6QHnAXYBbQFa
AWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFE
AWQBWgFEAXcBbgFb/wAnAAF+AXIBWAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6
AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAHFAcABtQH3AfYB9QHvAe0B6wHvAe0B6wHX
AdQBzwFyAWgBVAFkAVoBRAFkAVoBRAFkAVoBRAFkAVoBRAFkAVoBRAFkAVoBRAFkAVoBRAFkAVoBRAFk
AVoBRAFkAVoBRAFlAVsBRf8AJwABfgFyAVgBegFuAVQBegFuAVQBegFuAVQBegFuAVQBegFuAVQBegFu
AVQBegFuAVQBegFuAVQBegFuAVQBegFuAVQBegFuAVQBegFuAVQBhwF8AWQB8wHyAe8B9wH2AfUB7wHt
AesB7wHtAesB3AHZAdQBdgFtAVkBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFa
AUQBZAFaAUQBZAFaAUQBZQFbAUX/ACcAAYwBggFsAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFU
AXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAZABhgFwAfAB7gHr
AfcB9gH1Ae8B7QHrAe8B7QHrAdwB2QHUAW0BZAFPAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFE
AWQBWgFEAWQBWgFEAWQBWgFEAXcBbgFb/wAnAAGnAZ8BjwF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6
AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAGM
AYEBawH0AfMB8QH3AfYB9QHvAe0B6wHvAe0B6wGzAa4BowFkAVoBRAFkAVoBRAFkAVoBRAFkAVoBRAFk
AVoBRAFkAVoBRAFkAVoBRAFkAVoBRAGVAY4BgP8AJwAByAHEAbwBegFuAVQBegFuAVQBegFuAVQBegFu
AVQBegFuAVQBegFuAVQBegFuAVQBegFuAVQBegFuAVQBegFuAVQBegFuAVQBegFuAVQBegFuAVQBegFu
AVQBegFuAVQBtQGvAaAD/wH3AfYB9QHvAe0B6wHiAd8B2wFkAVoBRAFkAVoBRAFkAVoBRAFkAVoBRAFk
AVoBRAFkAVoBRAFkAVoBRAFkAVoBRAG+AboBsv8AJwAB6gHpAecBegFuAVQBegFuAVQBegFuAVQBegFu
AVQBegFuAVQBegFuAVQBegFuAVQBegFuAVQB7wHtAeoB9AHzAfAB9AHzAfAB9AHzAfABpwGfAY4BegFu
AVQBegFuAVQBpgGeAY0G/wH3AfYB9QHuAewB6gFkAVoBRAFkAVoBRAFkAVoBRAFkAVoBRAFkAVoBRAFk
AVoBRAFkAVoBRAFkAVoBRAHmAeUB4v8AJwAD/gGMAYIBbAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6
AW4BVAF6AW4BVAF6AW4BVAHoAeUB4Qn/Ad8B3AHWAX4BcwFaAXsBbwFVAdABzAHDCf8B6gHoAeUBZAFa
AUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBdQFsAVoD/f8AKgAB0gHPAckBegFu
AVQBegFuAVQBegFuAVQBegFuAVQBegFuAVQBegFuAVQBegFuAVQBuwG1AagM/wH2AfUB9AHzAfIB8Az/
AcsBxwG9AW8BZAFMAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAWQBWgFEAcoBxgHB/wAtAAP8
AYwBggFsAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAYABdQFcAegB5gHiGP8B9AHz
AfEBiQF/AWgBegFuAVQBbwFkAUwBZAFaAUQBZAFaAUQBZAFaAUQBZAFaAUQBdwFvAVsD+/8AMAAB5QHk
AeEBegFuAVQBegFuAVQBegFuAVQBegFuAVQBegFuAVQBegFuAVQBegFuAVQBhQF6AWIB0gHOAcUD/g//
Ad4B2wHUAY4BhAFuAXoBbgFUAXoBbgFUAXoBbgFUAW8BZAFMAWQBWgFEAWQBWgFEAWQBWgFEAd8B3gHa
/wA2AAHGAcIBuQF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAGI
AX0BZgGnAZ8BjQG1Aa4BoAG2Aa8BoQGqAaIBkQGNAYMBbAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6
AW4BVAF6AW4BVAFvAWQBTAFkAVoBRAG6AbYBrv8AOQAD/gG4AbIBpgF6AW4BVAF6AW4BVAF6AW4BVAF6
AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6
AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAF6AW4BVAGyAawBoQP+/wA8AAP+AcYBwgG5
AXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFU
AXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAcYBwQG4A/7/AEUA
AeUB5AHhAYwBggFsAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFU
AXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAYwBggFsAeUB5AHh/wBOAAP8AdIBzwHI
AYwBggFsAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFUAXoBbgFU
AXoBbgFUAYsBgQFrAdIBzwHIA/z/AFcAA/4B6gHpAecByAHEAbwBpwGfAY8BjAGCAWwBfQFyAVgBfQFy
AVgBjAGCAWwBpwGfAY8ByAHEAbwB6gHpAecD/v8A/wD/ACEAA9rMAAP+AdwB3QHpA+oD/S0AA/8C4QHs
AucB6AP8OQAD8gOOAw0YAANEA8YD/wkAA5szAAPyA44DDRgAA0QDxgP/NgAD8gOOAw0YAANEA8YD/wwA
A/4BuQG9AeMBAgEXAc0BhAGKAcYD5wP9JwAD/wLRAegCBwG+AmkBvwLiAeMD/DYAA1UDAgNSGFsDKAMA
A98JAANLA/0wAANVAwIDUhhbAygDAAPfNgADVQMCA1IYWwMoAwAD3wkAA/4BuQG+AeQBDAEiAdUBOgFF
AfQBDAEfAdUBhAGKAcYD5wP9IQAD/wLRAegBBwEJAcQCAAHvAgABzgJpAb8C4gHjA/wwAAPvAwADpRsA
A/sDBQN7CQADQAPcLQAD7wMAA6UbAAP7AwUDezMAA+8DAAOlGwAD+wMFA3sGAAP+AbkBvgHkAQ0BJQHW
AUgBUgH4AU0BVQH+AUMBTAH6AQwBHwHVAYQBigHGA+cD/RsAA/8C0QHoAQgBCwHGAQMBBAHyAgAB/gIA
AfsCAAHOAmkBvwLiAeMD/AwAA/4e+wPaAwADvB4AAw0DWwkAA0ADowwAA/4e+wPaAwADvB4AAw0DWxIA
A/4e+wPaAwADvB4AAw0DWwMAA/4BuQG/AeQBDgEoAdcBTwFaAfkBVgFeAf4BUgFaAf4BTQFVAf4BQwFM
AfoBDAEfAdUBhAGKAcYD5wP9FQAD/wLRAegBCAEOAccBCQELAfMCCAH+AQMBBAH+AgAB/gIAAfsCAAHO
AmkBvwLiAeMD/AYAA/8DRiQAA7wMAAPDA/IMAAMNA1sJAANAA1AD/QkAA0YkAAO8DAADwwPyDAADDQNb
EgADRiQAA7wMAAPDA/IMAAMNA1sDAAG+AcQB6AEPASsB2QFWAWIB+QFeAWcB/gFaAWMB/gFWAV4B/gFS
AVoB/gFNAVUB/gFDAUwB+gEMAR8B1QGEAYoBxgPnA/0PAAP/AdEB0gHoAQkBEQHJARABEwHzARABEQH+
AQwBDQH+AggB/gEDAQQB/gIAAf4CAAH7AgABzgJpAb8D6gYAA/0DAAMkG3IDVQMAA7wJAAP4AwADlgwA
Aw0DWwkABkAD4AwAAyQbcgNVAwADvAkAA/gDAAOWDAADDQNbFQADJBtyA1UDAAO8CQAD+AMAA5YMAAMN
A1sD/AEuAUkB2QE5AU0B6wFmAXAB/gFiAWwB/gFeAWcB/gFaAWMB/gFWAV4B/gFSAVoB/gFNAVUB/gFD
AUwB+gEMAR8B1QGEAYoBxgPnA/0JAAP/AdEB0gHoAQkBFAHKARcBGwHzARgBGgH+ARQBFgH+ARABEQH+
AQwBDQH+AggB/gEDAQQB/gIAAf4CAAHtAg8BwALrAfIGAAP9AwADchsAA+IDAAO8CQAD9gMAA5EMAAMN
A1sJAAZAA6MMAANyGwAD4gMAA7wJAAP2AwADkQwAAw0DWxUAA3IbAAPiAwADvAkAA/YDAAORDAADDQNb
AwAB8wH0AfgBLwFKAdkBQgFVAe8BZgFwAf4BYgFsAf4BXgFnAf4BWgFjAf4BVgFeAf4BUgFaAf4BTQFV
Af4BQwFMAfoBDAEfAdUBhAGKAcYD5wP9AwAD/wHRAdMB6QEKARcBzAEdASMB8wEgASMB/gEcAR8B/gEY
ARoB/gEUARYB/gEQAREB/gEMAQ0B/gIIAf4BAwEEAfABDwERAcUC3gHuCQAD/QMAA3IbAAPiAwADvAkA
A/kDAAOaDAADDQNbCQAGQANSA/4JAANyGwAD4gMAA7wJAAP5AwADmgwAAw0DWxUAA3IbAAPiAwADvAkA
A/kDAAOaDAADDQNbBgAB8wH0AfgBLwFKAdkBQgFVAe8BZgFwAf4BYgFsAf4BXgFnAf4BWgFjAf4BVgFe
Af4BUgFaAf4BTQFVAf4BQwFMAfoBDAEfAdUBhAGKAcYD5wP8AdEB0wHpAQsBGQHNASQBKgH0ASkBLQH+
ASQBKAH+ASABIwH+ARwBHwH+ARgBGgH+ARQBFgH+ARABEQH+AQkBCwHwAQ8BEwHGAd4B3wHuDAAD/QMA
A3IbAAPiAwADvAwAA9QD9QwAAw0DWwkACUAD6QkAA3IbAAPiAwADvAwAA9QD9QwAAw0DWxUAA3IbAAPi
AwADvAwAA9QD9QwAAw0DWwkAAfMB9AH4AS8BSgHZAUIBVQHvAWYBcAH+AWIBbAH+AV4BZwH+AVoBYwH+
AVYBXgH+AVIBWgH+AU0BVQH+AUMBTAH6AQwBHwHVAYQBigHGAbMBtgHTAQsBHAHPASsBMgH0ATEBNgH+
AS0BMQH+ASkBLQH+ASQBKAH+ASABIwH+ARwBHwH+ARgBGgH+AQ8BEwHxARABFgHIAd4B3wHuDwAD/QMA
A3IbAAPvAwADmhsAA/gDBAN7CQAJQAOuCQADchsAA+8DAAOaGwAD+AMEA3sVAANyGwAD7wMAA5obAAP4
AwQDewwAAfMB9AH4AS8BSgHZAUIBVQHvAWYBcAH+AWIBbAH+AV4BZwH+AVoBYwH+AVYBXgH+AVIBWgH+
AU0BVQH+AUMBTAH6AQwBHwHVAQkBHAHPATEBOgH0ATkBPwH+ATUBOgH+ATEBNgH+AS0BMQH+ASkBLQH+
ASQBKAH+ASABIwH+ARYBGgHxARABGAHKAd4B3wHuEgAD/QMAA3IbAAP/AywDFgPtFQAD/AOWAwADygkA
CUADWgP+BgADchsAA/8DLAMWA+0VAAP8A5YDAAPKFQADchsAA/8DLAMWA+0VAAP8A5YDAAPKDwAB8wH0
AfgBLwFKAdkBQgFVAe8BZgFwAf4BYgFsAf4BXgFnAf4BWgFjAf4BVgFeAf4BUgFaAf4BTQFVAf4BQwFM
AfoBOQFCAfUBQQFIAf4BPQFDAf4BOQE/Af4BNQE6Af4BMQE2Af4BLQExAf4BKQEtAf4BHAEiAfEBEQEa
AcsB3gHfAe8VAAP9AwADch4AA88DBQMAAz4SUAMWAwADVQP7CQAMQAPsBgADch4AA88DBQMAAz4SUAMW
AwADVQP7FQADch4AA88DBQMAAz4SUAMWAwADVQP7EgAB8wH0AfgBLwFKAdkBQgFVAe8BZgFwAf4BYgFs
Af4BXgFnAf4BWgFjAf4BVgFeAf4BUgFaAf4BTQFVAf4BSQFRAf4BRQFMAf4BQQFIAf4BPQFDAf4BOQE/
Af4BNQE6Af4BMQE2Af4BIgEpAfIBEQEdAc0B3gHfAe8YAAP9AwADciEAA9kDAAMEDw0DCwMAA1kD/QwA
DEADuAYAA3IhAAPZAwADBA8NAwsDAANZA/0YAANyIQAD2QMAAwQPDQMLAwADWQP9GAAB8wH0AfgBLwFK
AdkBQgFVAe8BZgFwAf4BYgFsAf4BXgFnAf4BWgFjAf4BVgFeAf4BUgFaAf4BTQFVAf4BSQFRAf4BRQFM
Af4BQQFIAf4BPQFDAf4BOQE/Af4BKQExAfIBEgEfAc4B3gHgAe8bAAP+AwADciEAA/YDAAORDwAD9gMA
A5EPAAxAA2MGAANyIQAD9gMAA5EPAAP2AwADkRsAA3IhAAP2AwADkQ8AA/YDAAORHgAB8wH0AfgBLwFK
AdkBQgFVAe8BZgFwAf4BYgFsAf4BXgFnAf4BWgFjAf4BVgFeAf4BUgFaAf4BTQFVAf4BSQFRAf4BRQFM
Af4BQQFIAf4BLwE4AfIBEgEhAc8B3gHgAe8hAAMlAz4hAAP2AwADkQ8AA/YDAAORDwAPQAPsAyUDPiEA
A/YDAAORDwAD9gMAA5EYAAMlAz4hAAP2AwADkQ8AA/YDAAORIQAB8wH0AfgBIwE/AdYBRAFWAe8BZgFw
Af4BYgFsAf4BXgFnAf4BWgFjAf4BVgFeAf4BUgFaAf4BTQFVAf4BSQFRAf4BNwFBAfQBCAEcAc4BvQHA
AdcD/SEAA2wDAAP3HgAD9gMAA5EPAAP2AwADkQ8AD0ADzQNsAwAD9x4AA/YDAAORDwAD9gMAA5EYAANs
AwAD9x4AA/YDAAORDwAD9gMAA5EeAAP/AdEB1QHrARABLgHZAVoBaQH2AWoBdQH+AWYBcAH+AWIBbAH+
AV4BZwH+AVoBYwH+AVYBXgH+AVIBWgH+AU0BVQH+AUMBTAH6AQwBHwHVAYUBjAHHA+cD/R4AA9gDAAN6
HgADxwMAA1YPAAPgAwADqQ8AD0AD8QPYAwADeh4AA8cDAANWDwAD4AMAA6kYAAPYAwADeh4AA8cDAANW
DwAD4AMAA6kbAAP/AdEB1gHrARABMAHaAWABcAH2AXIBfgH+AW4BeQH+AWoBdQH+AWYBcAH+AWIBbAH+
AV4BZwH+AVoBYwH+AVYBXgH+AVIBWgH+AU0BVQH+AUMBTAH5AQwBHgHVAYUBjAHHA+cD/RsAA/8DYQMA
A30D+RIAA/wDuwkAA+0MAAN1AwAD1w8ADEADbQMAA/8DYQMAA30D+RIAA/wDuwkAA+0MAAN1AwAD1xgA
A/8DYQMAA30D+RIAA/wDuwkAA+0MAAN1AwAD1xgAA/8B0gHWAesBEwE1AdwBZgF4AfcBewGHAf4BdwGC
Af4BcgF+Af4BbgF5Af4BagF1Af4BZgFwAf4BYgFsAf4BXgFnAf4BWgFjAf4BVgFeAf4BUgFaAf4BTQFV
Af4BQwFLAfkBCwEeAdUBhgGNAccD5wP9GwAD/ANcAwADBQNJA3sJfANZAwcDAAM5A6EDAANSA90D/wP3
A68DBANAA/0PAAxAA7gGAAP8A1wDAAMFA0kDewl8A1kDBwMAAzkDoQMAA1ID3QP/A/cDrwMEA0AD/RUA
AQ4BfwEAAQ4BfwEAAQ4BfwEAA1wDAAMFA0kDewl8A1kDBwMAAzkDoQMAA1ID3QP/A/cDrwMEA0AD/RUA
A/8B0wHYAewBEwE4Ad0BbQF/AfcBgwGQAf4BfwGLAf4BewGHAf4BdwGCAf4BcgF+Af4BbgF5Af4BagF1
Af4BZgFwAf4BYgFsAf4BXgFnAf4BWgFjAf4BVgFeAf4BUgFaAf4BTQFVAf4BQwFLAfkBCwEeAdUBhgGN
AccD5wP9GwAD/gPRAyIVAAOuA/0DAAO0BgADLAMFAwADJQPtEgAMQAPsCQAD/gPRAyIVAAOuA/0DAAO0
BgADLAMFAwADJQPtGAABDgF/AQABDgF/AQABDgF/AQAD/gPRAyIVAAOuA/0DAAO0BgADLAMFAwADJQPt
FQAD/wHTAdgB7AETAToB3wFzAYcB9wGLAZkB/gGHAZUB/gGDAZAB/gF/AYsB/gF7AYcB/gF3AYIB/gFy
AX4B/gFYAWcB9QFGAVgB8AFmAXAB/gFiAWwB/gFeAWcB/gFaAWMB/gFWAV4B/gFSAVoB/gFNAVUB/gFD
AUsB+QELAR4B1QGIAY4BxwPnA/0bAAPnAwUDDwO2A+sD8gPRAzkDAAOjCQAD2wOTAzIDSwOaA/kVAAlA
A2MPAAPnAwUDDwO2A+sD8gPRAzkDAAOjCQAD2wOTAzIDSwOaA/kbAAEOAX8BAAEOAX8BAAEOAX8EAAPn
AwUDDwO2A+sD8gPRAzkDAAOjCQAD2wOTAzIDSwOaA/kVAAP/AdQB2QHsARQBPQHgAXkBjgH3AZMBogH+
AY8BngH+AYsBmQH+AYcBlQH+AYMBkAH+AX8BiwH+AXsBhwH+AV4BbwH2ARIBMQHZASQBPwHYAUUBVwHw
AWYBcAH+AWIBbAH+AV4BZwH+AVoBYwH+AVYBXgH+AVIBWgH+AU0BVQH+AUIBSwH5AQsBHgHUAYgBjgHH
A+cD/RUAA/sDLAMPA+8MAAP8A1MDAAPhLQAJQAO1DAAD+wMsAw8D7wwAA/wDUwMAA+EzAAEOAX8BAAEO
AX8BAAEOAX8BAAP7AywDDwPvDAAD/ANTAwAD4SoAA/8B1QHaAewBFAE/AeIBgAGWAfgBnAGrAf4BmAGn
Af4BkwGiAf4BjwGeAf4BiwGZAf4BhwGVAf4BgwGQAf4BZAF2AfYBEwEzAtoB3QHvAfEB8gH3ASgBQwHa
AUUBVwHwAWYBcAH+AWIBbAH+AV4BZwH+AVoBYwH+AVYBXgH+AVIBWgH+AU0BVQH+AUIBSwH5AQsBHgHU
AYkBkAHHA+gD/RIAA9oDAAO2EgAD8AMAA40tAAlAA+kMAAPaAwADthIAA/ADAAONMwABDgF/AQABDgF/
AQABDgF/AQAD2gMAA7YSAAPwAwADjScAA/8B1QHaAe0BFAFCAeMBhgGdAfgBpAG0Af4BoAGwAf4BnAGr
Af4BmAGnAf4BkwGiAf4BjwGeAf4BiwGZAf4BawF+AfcBFAE2AdwB2gHeAe8GAAHyAfMB+AEoAUMB2gFF
AVcB8AFmAXAB/gFiAWwB/gFeAWcB/gFaAWMB/gFWAV4B/gFSAVoB/gFNAVUB/gFCAUsB+QELAR4B1AGK
AZABxwPoA/0PAAOoAwAD7RUAAy8DPi0ABkADWgP+DAADqAMAA+0VAAMvAz4kAAEOAX8BAAEOAX8BAAEO
AX8BAAEOAX8BAAEOAX8BAAEOAX8BAAEOAX8BAAEOAX8BAAEOAX8BAAEOAX8BAAEOAX8BAAEOAX8BAAEO
AX8QAAMvAz4nAAHZAd4B7wEVAUQB5QGMAaQB+AGsAb0B/gGoAbkB/gGkAbQB/gGgAbAB/gGcAasB/gGY
AacB/gGTAaIB/gFyAYYB9wEUATkB3QHaAd4B7wwAAfIB8wH4ASgBQwHaAUUBVwHwAWYBcAH+AWIBbAH+
AV4BZwH+AVoBYwH+AVYBXgH+AVIBWgH+AU0BVQH+AUIBSwH5AQsBHgHUAYoBkAHHA+wPAAOVAwAD9RUA
A0kDIi0ABkADrg8AA5UDAAP1FQADSQMiJAABDgF/AQABDgF/AQABDgF/AQABDgF/AQABDgF/AQABDgF/
AQABDgF/AQABDgF/AQABDgF/AQABDgF/AQABDgF/AQABDgF/AQABDgF/EAADSQMiJAAC/AH9ASABTgHl
AWgBiQHzAbQBxgH+AbABwgH+AawBvQH+AagBuQH+AaQBtAH+AaABsAH+AZwBqwH+AXgBjQH3ARUBPAHf
AdoB3gHvEgAB8gHzAfgBKAFDAdoBRQFXAfABZgFwAf4BYgFsAf4BXgFnAf4BWgFjAf4BVgFeAf4BUgFa
Af4BTQFVAf4BOAFDAfIBAgEXAc0B5gHnAe8PAAPJAwAD0xIAA/sDBANwLQAGQAPnDwADyQMAA9MSAAP7
AwQDcCQAAQ4BfwEAAQ4BfwEAAQ4BfwEAAQ4BfwEAAQ4BfwEAAQ4BfwEAAQ4BfwEAAQ4BfwEAAQ4BfwEA
AQ4BfwEAAQ4BfwEAAQ4BfwEAAQ4Bfw0AA/sDBANwJwAB5wHqAfUBGwFLAeYBiAGjAfgBtAHGAf4BsAHC
Af4BrAG9Af4BqAG5Af4BpAG0Af4BfwGVAfgBFQE+AeAB2gHeAfAYAAHyAfMB+AEoAUMB2gFFAVcB8AFm
AXAB/gFiAWwB/gFeAWcB/gFaAWMB/gFWAV4B/gFHAVEB+AELASEB1AHGAcoB6QP/DwAD9AMHAzwD/Q8A
A5sDAAPCLQADQANQA/0PAAP0AwcDPAP9DwADmwMAA8IzAAEOAX8BAAEOAX8BAAEOAX8BAAP0AwcDPAP9
DwADmwMAA8IqAAHnAeoB9QEbAUsB5gGIAaMB+AG0AcYB/gGwAcIB/gGsAb0B/gGFAZwB+AEWAUEB4gHa
Ad8B8B4AAfIB8wH4ASgBQwHaAUUBVwHwAWYBcAH+AWIBbAH+AV4BZwH+AU4BWQH4AQwBJAHVAcYBygHp
A/8VAAO1AwADXAPzBgAD/AOfAwADVgP+LQADQAOnFQADtQMAA1wD8wYAA/wDnwMAA1YD/jMAAQ4BfwEA
AQ4BfwEAAQ4BfwQAA7UDAANcA/MGAAP8A58DAANWA/4tAAHnAeoB9QEbAUsB5gGIAaMB+AG0AcYB/gGM
AaQB+AEWAUQB4wHaAd8B8CQAAfIB8wH4ASgBQwHaAUUBVwHwAWYBcAH+AVUBYQH4AQ0BJwHXAcYBygHp
A/8YAAP+A5YGAAM2A0sDBwMAA1MD9TAAA0AD4xUAA/4DlgYAAzYDSwMHAwADUwP1NgABDgF/AQABDgF/
AQABDgF/BAAD/gOWBgADNgNLAwcDAANTA/UzAAHnAeoB9QEbAUsB5gFoAYkB8wEXAUUB5QHaAd8B8CoA
AfIB8wH4ASgBQwHaAToBTgHrAQ4BKgHYAcYBywHqA/8hAAPfA38DNwMgA2kDvAP+MwADSwP9GwAD3wN/
AzcDIANpA7wD/jkAAQ4BfwEAAQ4BfwEAAQ4BfwoAA98DfwM3AyADaQO8A/45AAHnAeoB9QEgAU4B5QHc
AeEB8TAAAfIB8wH4ASoBRQHZAccBzQHrA/9sAAObbAABDgF/AQABDgF/AQABDgF/WwAD/DYAA/z/AMAA
Aa8BWAFVAa8BWAFVAa8BWAFV/wBmAAGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGv
AVgBVQGvAVgBVQGvAVgBVTYAA+UDdwMmAygDewPoTgAD5QN3AyYDKAN7A+hUAAz/JP4M/xsAAa8BWAFV
Aa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFV
Aa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVMwADugMCAwUDUANPAwQDAgPBSAADugMCAwUDUANPAwQDAgPB
PwAD/gP4A/ID7gPpA+YD4wneA9wD1RjUA9UD3AneA+QD5gPqA+8D8wP4A/4DAAGvAVgBVQGvAVgBVQGv
AVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGv
AVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVTAAA+UDAgNHA/MGAAPyA0ADBAPpQgAD5QMCA0cD8wYA
A/IDQAMEA+k8AAP6A+ED0QPHAbABuQG+AakBtAG4AakBswG4AaMBrwGzAaABrAGyAaABrAGyAaABrAGy
AZ8BrAGwAZ0BqwGvAZsBpwGtAZsBpwGtAZsBpwGtAZsBpwGtAZsBpwGtAZsBpwGtAZ8BqwGxAZ8BrAGw
AaABrAGyAaABrAGyAaABrAGyAaQBsAG1AaoBswG4AasBtAG4AbIBuwG/A8cD0gPkA/wDAAGvAVgBVQGv
AVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGv
AVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGv
AVgBVSEAA3gDBAPzDAAD8AMCA4MhAAP9A8cDjQOYA94D/w8AA3gDBAPzDAAD8AMCA4MhAAP9A8cDjQOY
A94D/wkAA/8D/gHnAfAB9AEsAbIB5AEKAasB5wEKAasB5wEKAasB5wEKAasB5wEKAasB5wEKAasB5wEK
AasB5wEKAasB5wEKAasB5wEKAasB5wEKAasB5wEKAasB5wEKAasB5wEKAasB5wEKAasB5wEKAasB5wEK
AasB5wEKAasB5wEKAasB5wEKAasB5wEKAasB5wEKAasB5wEKAasB5wEKAasB5wEnAbEB5QHjAe8B8wP+
BgABrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFY
AVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBsAFZAVYBtQFlAWIBtgFm
AWMBsQFcAVkBrwFYAVUBrwFYAVUBrwFYAVUbAAMqA08SAANCAzceAAP2Az4MAAOEA/4MAAMqA08SAANC
AzceAAP2Az4MAAOEA/4MAAFLAb0B5QEPAasB5QEPAasB5QEPAasB5QEPAasB5QEPAasB5QEPAasB5QEP
AasB5QEPAasB5QEPAasB5QEPAasB5QEPAasB5QEPAasB5QEPAasB5QEPAasB5QEPAasB5QEPAasB5QEP
AasB5QEPAasB5QEPAasB5QEPAasB5QEPAasB5QEPAasB5QEPAasB5QEPAasB5QEPAasB5QEPAasB5QE5
AbcB5gkAAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFV
Aa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAfwC+Qf/Av4B4gHD
AcIBsAFZAVYBrwFYAVUbAAMsA0sSAANAAzkeAANoAwADqQP2A+8DaAMAA8AMAAMsA0sSAANAAzkeAANo
AwADqQP2A+8DaAMAA8AMAAESAa0B5gESAa0B5gESAa0B5gESAa0B5gESAa0B5gESAa0B5gESAa0B5gES
Aa0B5gESAa0B5gESAa0B5gESAa0B5gESAa0B5gESAa0B5gESAa0B5gESAa0B5gESAa0B5gESAa0B5gES
Aa0B5gESAa0B5gESAa0B5gESAa0B5gESAa0B5gESAa0B5gESAa0B5gESAa0B5gESAa0B5gESAa0B5gES
Aa0B5gP+BgABrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFY
AVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUP/wHiAcIBwQGv
AVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQwAA30DBAPxDAAD7QMAA4gbAAP2AwADdAkA
A/wDFwNJDAADfQMEA/EMAAPtAwADiBsAA/YDAAN0CQAD/AMXA0kMAAEWAa0B5gEWAa0B5gEWAa0B5gEW
Aa0B5gEWAa0B5gEWAa0B5gEWAa0B5gEWAa0B5gEWAa0B5gEWAa0B5gEWAa0B5gEWAa0B5gEWAa0B5gEW
Aa0B5gEWAa0B5gEWAa0B5gEWAa0B5gEWAa0B5gEWAa0B5gEWAa0B5gEWAa0B5gEWAa0B5gEWAa0B5gEW
Aa0B5gEWAa0B5gEWAa0B5gEWAa0B5gEWAa0B5gP+BgABrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFY
AVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFY
AVUBrwFYAVUBrwFYAVUP/wH+AvwBrwFYAVUB+QLzAfgC8AHpAdABzwG8AXMBcAGvAVgBVQGvAVgBVQkA
A+kDBAM+A+8GAAPtAzcDBQPtGwAD6QMAA7EMAANQAxoMAAPpAwQDPgPvBgAD7QM3AwUD7RsAA+kDAAOx
DAADUAMaDAABGwGvAecBGwGvAecBGwGvAecBGwGvAecBGwGvAecBGwGvAecBGwGvAecBGwGvAecBGwGv
AecBGwGvAecBGwGvAecBGwGvAecBGwGvAecBGwGvAecBGwGvAecBGwGvAecBGwGvAecBGwGvAecBGwGv
AecBGwGvAecBGwGvAecBGwGvAecBGwGvAecBGwGvAecBGwGvAecBGwGvAecBGwGvAecBGwGvAecD/gYA
Aa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAcMBgQF/AcMBgQF/
Aa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVEv8BrwFYAVUB+gH1AfQJ/wHH
AYoBiAGvAVgBVQwAA8QDBAMCA0ADPAYAA7seAAP4AwIDYQP/BgAD+AMPA1UPAAPEAwQDAgNAAzwGAAO7
HgAD+AMCA2ED/wYAA/gDDwNVDAABHwGxAegBHwGxAegBHwGxAegBHwGxAegBHwGxAegBHwGxAegBHwGx
AegBHwGxAegBHwGxAegBHwGxAegBHwGxAegBHwGxAegBHwGxAegBHwGxAegBHwGxAegBHwGxAegBHwGx
AegBHwGxAegBHwGxAegBHwGxAegBHwGxAegBHwGxAegBHwGxAegBHwGxAegBHwGxAegBHwGxAegBHwGx
AegBHwGxAegD/gYAAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFV
Bv8BrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUS/wGvAVgBVQH6AfUB9An/
AfoC9AGvAVgBVQ8AA+sDhgM6AzwDEAMAA20D/x4AA4ADAAOGA+cD3ANKAwAD0BIAA+sDhgM6AzwDEAMA
A20D/x4AA4ADAAOGA+cD3ANKAwAD0AwAASQBsQHpASQBsQHpASQBsQHpASQBsQHpASQBsQHpASQBsQHp
ASQBsQHpASQBsQHpASQBsQHpASQBsQHpASQBsQHpASQBsQHpASQBsQHpASQBsQHpASQBsQHpASQBsQHp
ASQBsQHpASQBsQHpASQBsQHpASQBsQHpASQBsQHpASQBsQHpASQBsQHpASQBsQHpASQBsQHpASQBsQHp
ASQBsQHpASQBsQHpA/4GAAGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGv
AVgBVQb/Aa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVEv8BrwFYAVUB+gH1
AfQM/wGvAVgBVRsAA88GAAO/HgAD+wNGCQADAgOoIQADzwYAA78eAAP7A0YJAAMCA6gPAAEoAbIB6QEo
AbIB6QEoAbIB6QEoAbIB6QEoAbIB6QEoAbIB6QEoAbIB6QEoAbIB6QEoAbIB6QEoAbIB6QEoAbIB6QEo
AbIB6QEoAbIB6QEoAbIB6QEoAbIB6QEoAbIB6QEoAbIB6QEoAbIB6QEoAbIB6QEoAbIB6QEoAbIB6QEo
AbIB6QEoAbIB6QEoAbIB6QEoAbIB6QEoAbIB6QEoAbIB6QEoAbIB6QP+BgABrwFYAVUBrwFYAVUBrwFY
AVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUG/wGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGv
AVgBVQGvAVgBVQGvAVgBVRL/Aa8BWAFVAfoB9QH0DP8BrwFYAVUeAAOGAwADCwPuGwAD/QMmAwADcwO6
A/AnAAOGAwADCwPuGwAD/QMmAwADcwO6A/ASAAEsAbQB6gEsAbQB6gEsAbQB6gEsAbQB6gEsAbQB6gEs
AbQB6gEsAbQB6gEsAbQB6gEsAbQB6gEsAbQB6gEsAbQB6gEsAbQB6gEsAbQB6gEsAbQB6gEsAbQB6gEs
AbQB6gEsAbQB6gEsAbQB6gEsAbQB6gEsAbQB6gEsAbQB6gEsAbQB6gEsAbQB6gEsAbQB6gEsAbQB6gEs
AbQB6gEsAbQB6gEsAbQB6gP+BgABrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFY
AVUBrwFYAVUG/wGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVRL/Aa8BWAFV
AfoB9QH0DP8BrwFYAVUeAAP8AzkDAANEA/0YAAPJAwADEAP6LQAD/AM5AwADRAP9GAADyQMAAxAD+hgA
ATEBtgHrATEBtgHrATEBtgHrATEBtgHrATEBtgHrATEBtgHrATEBtgHrATEBtgHrATEBtgHrATEBtgHr
ATEBtgHrATEBtgHrATEBtgHrATEBtgHrATEBtgHrATEBtgHrATEBtgHrATEBtgHrATEBtgHrATEBtgHr
ATEBtgHrATEBtgHrATEBtgHrATEBtgHrATEBtgHrATEBtgHrATEBtgHrATEBtgHrA/4GAAGvAVgBVQGv
AVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQb/Aa8BWAFVAa8BWAFVAa8BWAFV
Aa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVEv8BrwFYAVUB9QHrAeoB+gH1AfQB+gH1AfQB+gH1AfQB+gH1
AfQBrwFYAVUhAAPrAwcDAAOYBgAD/gPqA9ADzQPlA/wDOgMAA58kAAz/A/4D6gMHAwADmAP+A/8D/gPp
A88DzQPlA/wDOgMAA58bAAE3AbcB7AE1AbYB7AE1AbYB7AE1AbYB7AE1AbYB7AE1AbYB7AE1AbYB7AE1
AbYB7AE1AbYB7AE1AbYB7AE1AbYB7AE1AbYB7AE1AbYB7AE1AbYB7AE1AbYB7AE1AbYB7AE1AbYB7AE1
AbYB7AE1AbYB7AE1AbYB7AE1AbYB7AE1AbYB7AE1AbYB7AE1AbYB7AE1AbYB7AE1AbYB7AE1AbYB7AE1
AbYB7AP+BgABrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUG/wGv
AVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQH6AfUB9AH6AfUB9AH6AfUB9AH6
AfUB9AH6AfUB9AH6AfUB9AGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVSQA
A7sGAAPaA8IDKgwAAw0DAAMHA/YVAAP9A/gD9APvA+0D6QPoA+cD4wbhA5AGAAOuA5kDIAwAAwsDAAMH
A/YbAAFJAb8B7gFBAbsB7QE5AbgB7AE5AbgB7AE5AbgB7AE5AbgB7AE5AbgB7AE5AbgB7AE5AbgB7AE5
AbgB7AE5AbgB7AE5AbgB7AE5AbgB7AE5AbgB7AE5AbgB7AE5AbgB7AE5AbgB7AE5AbgB7AE5AbgB7AE5
AbgB7AE5AbgB7AE5AbgB7AE5AbgB7AE5AbgB7AE5AbgB7AE5AbgB7AE5AbgB7AE5AbgB7AP+BgABrwFY
AVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUG/wGvAVgBVQGvAVgBVQGv
AVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGv
AVgBVQGvAVgBVTYAA/8DawMAAwIDAAMvA7AD3APeA7wDRwMAAyYD+BUAA/gB4AHiAeMBswHIAc8BiwG1
AcYBhAGxAcIBgQGuAcEBfAGsAb4BfAGsAb4BfAGrAb0BeQGpAbsBeAGoAbwBdwGnAboBIAEtATIJAAEN
ARIBFAE9AVQBXQFaAXkBhgFfAX8BiwFNAWUBbgEjASgBKgMAAyYD+BsAAVwBwAHqAXoB1gH2AVkBxgHx
AU0BwAHvAU0BwAHvAU0BwAHvAU0BwAHvAU0BwAHvAU0BwAHvAU0BwAHvAUYBvQHuATsBuAHsAT4BugHt
AT4BugHtAT4BugHtAT4BugHtAT4BugHtAT4BugHtAT4BugHtAT4BugHtAT4BugHtAT4BugHtAT4BugHt
AT4BugHtAT4BugHtAT4BugHtAT4BugHtAT4BugHtA/4GAAGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGv
AVgBVQGvAVgBVQGvAVgBVQGvAVgBVQb/Aa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFV
Aa8BWAFVFQABrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUqAAP4Aw8DAAOUA/0MAAP+A7oDAgNQ
A/4SAAP/AeMB7wH0AUgBvAHmAQ0BqwHmAQ0BqwHmAQwBqwHmAQ0BqwHmAQwBqwHmAQ0BqwHmAQ0BqwHm
AQwBqwHmAQ0BqwHmAQsBmQHOAQABBQEHAwABBAFBAVgBDAGkAdwBDAGrAeYBDQGrAeYBDQGrAeYBDAGr
AeYBQQG4AeMBkAGeAaQDAgNQA/4YAAFSAaIB1wE+AbYB6wFlAcwB8wFuAdEB9QFuAdEB9QFuAdEB9QFu
AdEB9QFuAdEB9QFuAdEB9QFuAdEB9QF2AdQB9gGDAdoB+AFeAcgB8gFBAbkB7gFCAboB7gFCAboB7gFC
AboB7gFCAboB7gFCAboB7gFCAboB7gFCAboB7gFCAboB7gFCAboB7gFCAboB7gFCAboB7gFCAboB7gFC
AboB7gFCAboB7gP+BgABrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUB6wHVAdQB6wHVAdQB6wHV
AdQG/wHXAasBqgHXAasBqgHXAasBqgGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQMAAa8BWAFVAa8BWAFV
Aa8BWAFVBgABrwFYAVUBvAF0AXEB7QHaAdkB/QL7AesB1QHUAboBbgFsAa8BWAFVJwAD3wMAA4MD/xUA
A7IDAAO9FQABvAHhAe4BFQGvAeYBEQGtAeYBEQGtAeYBEQGtAeYBEQGsAeYBEQGtAeYBEQGtAeYBEQGs
AeYBEQGtAeYBEQGtAeYBCwF5AaEDAAEFATgBSwEQAawB5QERAa0B5gERAawB5gERAa0B5gERAa0B5gER
AawB5gEVAa8B5gG6AeAB7gOyAwADvRgAAUgBlwHUAQsBeAHKARIBgQHPARMBggHQARMBggHQARMBggHQ
ARMBggHQARMBggHQARMBggHQARMBggHQARoBigHUAS8BpAHiAWcBzAH0AWcBzAHzAUcBvAHuAUcBvAHu
AUcBvAHuAUcBvAHuAUcBvAHuAUcBvAHuAUcBvAHuAUcBvAHuAUcBvAHuAUcBvAHuAUcBvAHuAUcBvAHu
AUcBvAHuAUcBvAHuA/4GAAGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVRj/Aa8BWAFVAa8BWAFV
Aa8BWAFVAa8BWAFVAa8BWAFVAbQBYgFfAcIBfwF9AbYBZgFjAa8BWAFVAa8BWAFVAa8BWAFVAfIB5QHk
Cf8B7QLaAa8BWAFVJwADcgMLA/gYAAP+AzADMgP/EgABugHgAe4BFwGuAeYBFwGtAeYBFwGuAeYBFwGu
AeYBFwGuAeYBFwGuAeYBFwGuAeYBFwGuAeYBFwGuAeYBFwGuAeYBBgEwAUABAAEEAQUBFAGcAc4BFwGu
AeYBFwGuAeYBFwGuAeYBFwGuAeYBFwGuAeYBFwGuAeYBFwGuAeYBuQHfAe0D/gMwAzID/xUAAUwBnAHZ
AREBfwHSAREBgAHSAREBgAHSAREBgAHSAREBgAHSAREBgAHSAREBgAHSAREBgAHSAREBgAHSAREBgAHS
ARABfgHRAR4BjgHZAWcBywHzAVYBwgHwAUsBvQHvAUsBvQHvAUsBvQHvAUsBvQHvAUsBvQHvAUsBvQHv
AUsBvQHvAUsBvQHvAUsBvQHvAUsBvQHvAUsBvQHvAUsBvQHvAUsBvQHvA/4GAAGvAVgBVQGvAVgBVQGv
AVgBVQGvAVgBVQGvAVgBVQG0AWIBYAHDAYIBgAHDAYIBgAHDAYIBgAHIAYwBigHXAawBqgHXAawBqgHX
AawBqgGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQHFAYYBhAH6AvUD/wH9AvoBzAGWAZQBrwFYAVUBtQFl
AWIP/wGwAVsBWCQAA/4DEANtHgADogMAA/USAAG8AeEB7wEdAbAB5wEdAbAB6AEdAbAB5wEdAbAB6AEd
AbAB5wEdAbAB6AEdAbAB5wEdAbAB5wEdAbAB6AEcAa0B5AEBAQYBCAEHAS4BPQEdAbAB5wEdAbAB6AEd
AbAB5wEdAbAB5wEdAbAB6AEdAbAB5wEdAbAB5wEdAbAB6AG6AeAB7gMAA6IDAAP1FQABUQGiAd4BGAGI
AdoBFAGGAdoBFAGGAdoBFAGGAdoBFAGGAdoBFAGGAdoBFAGGAdoBFAGGAdoBFAGGAdoBFAGGAdoBFAGG
AdoBEwGFAdkBKQGbAeEBegHUAfYBTQG9Ae8BTwG/AfABTwG/AfABTwG/AfABTwG/AfABTwG/AfABTwG/
AfABTwG/AfABTwG/AfABTwG/AfABTwG/AfABTwG/AfABTwG+AfAD/gYAAa8BWAFVAa8BWAFVAa8BWAFV
Aa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFV
Aa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAfMB5wHmCf8B+wL3AbIBXQFaAbABWwFYAfkC8gn/AfUC6gGv
AVgBVSQAA/oDAAObHgADxgMAA+cSAAG9AeEB7wEjAbEB6QEjAbEB6QEjAbEB6QEjAbEB6QEjAbEB6QEj
AbEB6QEjAbEB6QEjAbEB6QEjAbEB6QEgAaIB1QMAAQ4BSAFfASMBsQHpASMBsQHpASMBsQHpASMBsQHp
ASMBsQHpASMBsQHpASMBsQHpASMBsQHpAbwB4AHuAwADxgMAA+cVAAFuAbMB5QE9AZwB4wEVAYsB3wEX
AYwB3wEXAYwB3wEXAYwB3wEXAYwB3wEXAYwB3wEXAYwB3wEXAYwB3wEXAYwB3wEXAYwB3wEXAYwB3wEV
AYoB3wFGAbMB7QF2AdIB9gFTAb4B8QFUAb8B8QFUAb8B8QFUAb8B8QFUAb8B8QFUAb8B8QFUAb8B8QFU
Ab8B8QFUAb8B8QFUAb8B8QFTAb8B8QFaAcMB8QP+BgABrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFY
AVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFY
AVUBrwFYAVUBrwFYAVUD/gz/AbgBawFoAa8BWAFVAcgBjAGKAfwC+AP/AfoC9AHFAYUBgwGvAVgBVSQA
A/wDAAOOHgADvQMAA+wSAAG/AeEB7wEpAbMB6QEpAbMB6QEpAbMB6QEpAbMB6QEpAbMB6QEpAbIB6QEp
AbMB6QEpAbMB6QEpAbIB6QEmAakB3QMAAQ4BQQFUASkBswHpASkBswHpASkBswHpASkBswHpASkBswHp
ASkBswHpASkBswHpASkBswHpAb0B4QHuAwADvQMAA+wVAAHpAfAB9QE2AZ0B6AFPAagB6gFPAacB6QFP
AacB6QFPAacB6QFPAacB6QFPAacB6QFPAacB6QFPAacB6QFPAacB6QFPAacB6QFPAacB6QFPAacB6QFT
AaoB6gFoAckB8wGAAdcB9wFXAcAB8QFXAcAB8QFXAcEB8QFXAcEB8QFXAcEB8QFXAcEB8QFXAcEB8QFX
AcEB8QFXAcAB8QFeAcQB8gFuAc0B9AP+BgABrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFY
AVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFY
AVUBrwFYAVUB6QHSAdEJ/wH0AucBrwFZAVYBrwFYAVUBrwFYAVUBswFhAV4BvwF6AXgBswFgAV0BrwFY
AVUBrwFYAVUnAAM3AzwD/xsAA3gDBwP8EgABwAHiAe8BLgG1AeoBLwG1AesBLwG1AeoBLwG1AesBLgG1
AeoBLwG1AesBLgG1AeoBLgG1AeoBLwG1AesBLgG1AeoBBQEWAR0BBgEYASABLgG0AekBLgG1AesBLgG1
AeoBLwG1AeoBLgG1AesBLgG1AeoBLwG1AeoBLgG1AesBvgHhAe4DAAN4AwcD/BgAAfoB+wH8AeUB7gH0
AeQB7gH0AeQB7gH1AeQB7gH1AeQB7gH1AeQB7gH1AeQB7gH1AeQB7gH1AeQB7gH1AeQB7gH1AeQB7gH1
AeQB7gH1AeQB7gH1AdQB5wHyAWQBxgHzAYsB3AH5AYsB3AH4AYwB3AH5AYwB3AH5AYwB3AH5AYwB3AH5
AYwB3AH5AYwB3AH5AYwB3AH5AYUB2AH4AXEBxwHvCQABrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFY
AVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFY
AVUBrwFYAVUBrwFYAVUBtwFpAWYB5wHOAc0B+wL2AewC1gG8AXMBcAGvAVgBVQYAAa8BWAFVAa8BWAFV
Aa8BWAFVLQADpwMAA9wYAAPyAwcDdBUAAcIB4gHwATQBtgHsATQBtgHsATQBtgHsATQBtgHsATQBtgHs
ATQBtgHsATQBtgHsATQBtgHsATQBtgHsATQBtgHsARcBUgFqAwABIwF8AaEBNAG2AewBNAG2AewBNAG2
AewBNAG2AewBNAG2AewBNAG2AewBNAG2AewBwAHhAe8D8gMHA3RIAAHvAfQB9wGWAdIB8AFeAcIB8wFe
AcIB8wFeAcIB8wFeAcIB8wFeAcIB8wFeAcIB8wFeAcIB8wFeAcIB8wFsAccB8wHpAfEB9QkAAa8BWAFV
Aa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFV
Aa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFV
Aa8BWAFVPwAD+QMaAyYD9BIAA/sDSwMFA+wVAAHIAeQB7wFPAcEB7wFAAbsB7QE+AboB7QE+AboB7QE+
AboB7QE+AboB7QE+AboB7QE8AbkB7AE6AbgB7AE6AbgB7AE0AaYB1AEDAQoBDQEFAQ8BFAExAZ0ByAE6
AbgB7AE6AbkB7AE6AbkB7AE6AbgB7AE6AbkB7AE6AbkB7AG4AdgB5QNLAwUD7E4AAvsB/AHzAfcB+AHz
AfcB+AHzAfcB+AHzAfcB+AHzAfcB+AHzAfcB+AH0AfcB+AP9DAABrwFYAVUBrwFYAVUBrwFYAVUBrwFY
AVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFYAVUBrwFY
AVUBrwFYAVUBrwFYAVUBrwFYAVVRAAPcAwcDIAPNA/4GAAP/A94DOgMAA70YAAHMAeIB7gFaAcAB7QFf
AckB8gFeAckB8gFdAcgB8gFeAckB8gFdAckB8gFeAckB8gFeAckB8gFXAcUB8QFDAbsB7gFAAboB7gEr
AX8BowEBAQIBAwEEAQ0BEAEmAXEBkAE+AbQB5wFAAboB7gFAAboB7gE/AbgB7AEsAYEBpQEiASkBLAMA
A72BAAGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGv
AVgBVQGvAVgBVQGvAVgBVQGvAVgBVQGvAVgBVVQAA+ADJQMAAxcDXQNiAyQDAAMSA8gbAAHJAd0B6wEk
AYsB0wEoAZQB2AEqAZYB2QEqAZYB2QEqAZYB2QEqAZYB2QEqAZYB2QE2AaIB3wFUAb4B7QFfAcgB8gFG
AbsB7gFGAbwB7gExAYQBqAEFAQ8BEwMAAQMBCQEMAQ8BKQE1ARABLAE4AQUBDgESAwABCgEMAQ0DyJYA
Aa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVAa8BWAFVVwAD+wO+A2IDJQMi
A1UDrwP4HgABygHeAe0BIAGHAdYBEgGCAdQBEgGCAdQBEgGCAdQBEgGCAdQBEgGCAdQBEgGCAdQBEgGB
AdQBFgGGAdYBSAGyAekBWgHEAfEBTAG9Ae8BTAG+Ae8BRwGyAeABKQFmAYEBEQEsATgBBgEPARMBBQEO
AREBDwEmAS8BJAFaAXIBtwHUAeGoAAGvAVgBVQGvAVgBVQGvAVgBVY0AAc8B4QHvATgBmAHgARUBiQHd
ARYBiQHdARYBiQHcARYBiQHdARYBiQHdARYBiQHdARYBiQHdARUBiQHcARwBkAHfAWABxAHyAVkBwwHy
AVEBvwHxAVIBvwHxAVIBvwHxAVEBvwHxAVIBvwHxAVIBvwHxAVEBvwHxAVIBvwHxAcgB5AHw/wA/AAHw
AfQB9wFoAbIB5wFBAaEB5wFBAaAB5wFBAaAB5wFBAaAB5gFBAaAB5gFBAaAB5wFBAaAB5gFBAaAB5gFB
AaAB5wFXAbQB7QFwAc4B9QFeAcQB8gFWAcAB8QFWAcEB8QFWAcAB8QFWAcEB8QFWAcEB8QFWAcAB8QFf
AcUB8gHNAeYB8XsAAUIBTQE+BwABPgMAASgDAAGAAwABYAMAAQEBAAEBBgABBhYAA/8BAAT/DAAB/wHA
AQMB/wwAAf8CAAH/DAAB/gIAAX8MAAH4AgABHwwAAfACAAEPDAAB8AIAAQ8MAAHgAgABBwwAAcACAAED
DAABwAIAAQMMAAGAAgABAQwAAYACAAEBDAABgAIAAQEMAAGAAgABAQwAAYACAAEBDAABgAIAAQEMAAGA
AgABAQwAAYACAAEBDAABgAIAAQEMAAGAAgABAQwAAYACAAEBDAABgAIAAQEMAAHAAgABAwwAAcACAAED
DAAB4AIAAQcMAAHwAgABDwwAAfACAAEPDAAB+AIAAR8MAAH+AgABfwwAAf8CAAH/DAAB/wHAAQMB/wwA
BP8MAAT/AX8H/wH4AX8B/wEPAf8B/gEAAQcBfwH/AcABAAL/AcABAAHwAT8B/gEHAf8B/gEAAQcBPwH/
AcABAAL/AcABAAHgAR8B/AEDAf8B/AF/AccBPwH/AY8B+AL/AY8B+AHAAQ8B+AEBAeABAAF/AecBPAEA
AQ8C/AEAAQ8B/AGAAQcB8AEAAcABAAF5AecBHAEAAQ8BPAH8AQABDwE8AYABAwHgAQABwAEAAXEB5wEc
AQABDgE8AfwBAAEOATwBAAEBAcABAAHHAfwBcQHnARwB/wGOATwB/AH/AY4BPAGAAQABgAEBAccB/AFx
AecBDAH/AY4BPAH8Af8BjgE8AcACAAEDAccB/AF5AecBDAH/AY8BPAH8Af8BjwE8AeACAAEHAccB/AF/
AccBDAH/AY8B+AH8Af8BjwH4AfACAAEPAccB/AE/AYcBBAH/AYcB8AH8Af8BhwHwAfgCAAEfAccB/gEA
AQcBBAH/AcABAAH8Af8BwAEAAfwCAAE/AccB/wEAAQ8BBAH/AeABAQH8Af8B4AEBAf4CAAF/AccB/wIf
AQQB/wLjAfwB/wLjAf8CAAH/AecB/wIfAQAB/wLjAfwB/wLjAf8BgAEAAf8B4wH/Ah8BAAF/AuMB/AF/
AuMB/wIAAX8B4wH/Ah8BAAF/AuMB/AF/AuMB/gIAAT8B4AH8AQ8BHwEEAR8BgQHjAfwBHwGBAeMB/AIA
AR8B8AIAAR8BBgIAAQMB+AIAAQMB+AIAAQ8B+AEAAUABPwEHAQABCAEHAfgBAAEIAQcB8AIAAQcB/AEA
AeABfwEPAYABHAEPAfgBgAEcAQ8B4AIAAQMB+AF4AX8B/wMPAf8B+AIPAf8BwAIAAQEB+AH8AX8B/wEP
AR8BjwH/AfgBHwGPAf8BgAEBAYABAAH4Af4BfwH/AQ8BHwHPAf8BAAEHAc8B/wGAAQMBwAEAAfgB/gF/
Af8CHwHPAf8BAAEHAc8B/wEAAQcB4AEAAfgB/AF/Af8CHwGPAf8BAAEHAY8B/wGAAQ8B8AEAAfgBfAF/
Af8BHwEPAY8B/wH4AQ8BjwH/AcABHwH4AQEB/AEwAX8B/wE/AYYBDwH/AfgBhgEPAf8B4AE/AfwBAwH8
AQAC/wE/AYABHwH/AfgBgAEfAf8B8AF/Af4BBwH/AQEC/wE/AeABPwH/AfgB4AE/Af8B+AL/AQ8E/wF/
A/8B+AP/Af0C/wG/Ef8B/gE/Dv8BgAE/Af8B8AE/Av8B8AE/Av8B/AIAAT8B4AEAAT8B/wHgAR8C/wHg
AR8C/wQAAYABAAE/Af8BwwEPAv8BwwEPAv8EAAGAAQABAQH/AccBjwH+AQcBxwGPAf4BBwMAAQEBgAIA
AX8CzwH8AQMCzwH8AQMBwAIAAQMBgAIAAX8CzwH8AQMCzwH8AQMBwAIAAQEBgAIAAQMBxwGPAfgB4wHH
AY8B+AHjAcACAAEBAYACAAEBAcMBDwH4AfMBwwEPAfgB8wHAAgABAQGAAgABAQHgAR8B+AFjAeABHwH4
AWMBwAIAAQEBgAIAAQEB8AEPAfwBAwHwAQ8B/AEDAcACAAEBAYACAAEBAf8BDwH8AQcB/wEPAfwBBwHA
AgABAQGAAgABAQH/AYcB/AEPAf8BhwH8AQ8BwAIAAQEBgAIAAQEB/wGDAfwBPwH/AYMB/AE/AcACAAEB
AYACAAEBAf8BwwEAAX8B+AIAAX8BwAIAAQEBgAIAAQEB/wHgAQABfwMAAX8BwAIAAQEBgAIAAX8B/wHg
AQABfwMAAX8BwAIAAQEBgAEAAT8BgwH/AfABeAE/AwABPwHAAgABAQGAAQABIwEBAf8B8AH+AT8BgAIA
AT8BwAIAAQEBgAIAAQEB/wHxAf4BHwGAAgABHwHAAgABAQGAAgABAQH/AeMB/wEfAYABAAEBAR8BwAIA
AQEBgAIAAQEB/wHjAf8BHwGAAQABAQEfAcACAAEBAYACAAEBAf8B4wH/AR8BgAEAAQEBHwHAAgABAQGA
AgABAQH/AfEB/wEfAYABAAEBAR8B4AIAAQMBgAIAAccB/wHxAf4BPwGAAgABPwL/AcABAwGAAQABAQL/
AfAB/AE/AYACAAE/Av8B8AEHAYABAAE/Av8B+AEwAX8BgAIAAX8E/wHwAQABPwL/AfwBAAH/AYACAAb/
AcABPwL/Af4BAQH/AYABAAEBBv8B/gE/Bf8BgAEAAQEN/wGAAQABAQX/Cw==
</value>
</data>
</root>

325
LiamTestTeams/frmMain.Designer.cs generated Normal file
View File

@@ -0,0 +1,325 @@
namespace LiamTestTeams
{
partial class frmMain
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain));
this.tabControlLiam = new System.Windows.Forms.TabControl();
this.tabPageLogin = new System.Windows.Forms.TabPage();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.buttonLogin = new System.Windows.Forms.Button();
this.textBoxClientSecret = new System.Windows.Forms.TextBox();
this.label5 = new System.Windows.Forms.Label();
this.textBoxClientApp = new System.Windows.Forms.TextBox();
this.label4 = new System.Windows.Forms.Label();
this.textBoxTenant = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.groupBoxAccount = new System.Windows.Forms.GroupBox();
this.textBoxErrorMessage = new System.Windows.Forms.TextBox();
this.labelError = new System.Windows.Forms.Label();
this.textBoxDomain = new System.Windows.Forms.TextBox();
this.textBoxDisplayName = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.tabPageTeams = new System.Windows.Forms.TabPage();
this.ctrlTabTeams1 = new LiamTestTeams.ctrlTabLiam();
this.tabPageLiam = new System.Windows.Forms.TabPage();
this.ctrlTabLiam1 = new LiamTestTeams.ctrlTabLiam();
this.tabControlLiam.SuspendLayout();
this.tabPageLogin.SuspendLayout();
this.groupBox1.SuspendLayout();
this.groupBoxAccount.SuspendLayout();
this.tabPageTeams.SuspendLayout();
this.tabPageLiam.SuspendLayout();
this.SuspendLayout();
//
// tabControlLiam
//
this.tabControlLiam.Controls.Add(this.tabPageLogin);
this.tabControlLiam.Controls.Add(this.tabPageTeams);
this.tabControlLiam.Controls.Add(this.tabPageLiam);
this.tabControlLiam.Dock = System.Windows.Forms.DockStyle.Fill;
this.tabControlLiam.Location = new System.Drawing.Point(0, 0);
this.tabControlLiam.Name = "tabControlLiam";
this.tabControlLiam.SelectedIndex = 0;
this.tabControlLiam.Size = new System.Drawing.Size(880, 493);
this.tabControlLiam.TabIndex = 0;
//
// tabPageLogin
//
this.tabPageLogin.Controls.Add(this.groupBox1);
this.tabPageLogin.Controls.Add(this.groupBoxAccount);
this.tabPageLogin.Location = new System.Drawing.Point(4, 22);
this.tabPageLogin.Name = "tabPageLogin";
this.tabPageLogin.Padding = new System.Windows.Forms.Padding(3);
this.tabPageLogin.Size = new System.Drawing.Size(872, 467);
this.tabPageLogin.TabIndex = 0;
this.tabPageLogin.Text = "Login";
this.tabPageLogin.UseVisualStyleBackColor = true;
//
// groupBox1
//
this.groupBox1.Controls.Add(this.buttonLogin);
this.groupBox1.Controls.Add(this.textBoxClientSecret);
this.groupBox1.Controls.Add(this.label5);
this.groupBox1.Controls.Add(this.textBoxClientApp);
this.groupBox1.Controls.Add(this.label4);
this.groupBox1.Controls.Add(this.textBoxTenant);
this.groupBox1.Controls.Add(this.label3);
this.groupBox1.Location = new System.Drawing.Point(8, 6);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(861, 111);
this.groupBox1.TabIndex = 0;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Tenant and access properties";
//
// buttonLogin
//
this.buttonLogin.Enabled = false;
this.buttonLogin.Location = new System.Drawing.Point(458, 22);
this.buttonLogin.Name = "buttonLogin";
this.buttonLogin.Size = new System.Drawing.Size(75, 23);
this.buttonLogin.TabIndex = 6;
this.buttonLogin.Text = "Login";
this.buttonLogin.UseVisualStyleBackColor = true;
this.buttonLogin.Click += new System.EventHandler(this.buttonLogin_Click);
//
// textBoxClientSecret
//
this.textBoxClientSecret.Location = new System.Drawing.Point(144, 76);
this.textBoxClientSecret.Name = "textBoxClientSecret";
this.textBoxClientSecret.Size = new System.Drawing.Size(308, 20);
this.textBoxClientSecret.TabIndex = 2;
this.textBoxClientSecret.TextChanged += new System.EventHandler(this.textBoxInput_TextChanged);
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(70, 79);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(68, 13);
this.label5.TabIndex = 5;
this.label5.Text = "Client secret:";
//
// textBoxClientApp
//
this.textBoxClientApp.Location = new System.Drawing.Point(144, 50);
this.textBoxClientApp.Name = "textBoxClientApp";
this.textBoxClientApp.Size = new System.Drawing.Size(308, 20);
this.textBoxClientApp.TabIndex = 1;
this.textBoxClientApp.TextChanged += new System.EventHandler(this.textBoxInput_TextChanged);
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(31, 53);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(107, 13);
this.label4.TabIndex = 4;
this.label4.Text = "Client app ID (GUID):";
//
// textBoxTenant
//
this.textBoxTenant.Location = new System.Drawing.Point(144, 24);
this.textBoxTenant.Name = "textBoxTenant";
this.textBoxTenant.Size = new System.Drawing.Size(308, 20);
this.textBoxTenant.TabIndex = 0;
this.textBoxTenant.TextChanged += new System.EventHandler(this.textBoxInput_TextChanged);
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(33, 27);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(105, 13);
this.label3.TabIndex = 3;
this.label3.Text = "Tenant (DNS name):";
//
// groupBoxAccount
//
this.groupBoxAccount.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.groupBoxAccount.Controls.Add(this.textBoxErrorMessage);
this.groupBoxAccount.Controls.Add(this.labelError);
this.groupBoxAccount.Controls.Add(this.textBoxDomain);
this.groupBoxAccount.Controls.Add(this.textBoxDisplayName);
this.groupBoxAccount.Controls.Add(this.label2);
this.groupBoxAccount.Controls.Add(this.label1);
this.groupBoxAccount.Location = new System.Drawing.Point(8, 123);
this.groupBoxAccount.Name = "groupBoxAccount";
this.groupBoxAccount.Size = new System.Drawing.Size(861, 341);
this.groupBoxAccount.TabIndex = 1;
this.groupBoxAccount.TabStop = false;
this.groupBoxAccount.Text = "- not logged in -";
//
// textBoxErrorMessage
//
this.textBoxErrorMessage.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.textBoxErrorMessage.Location = new System.Drawing.Point(15, 104);
this.textBoxErrorMessage.Multiline = true;
this.textBoxErrorMessage.Name = "textBoxErrorMessage";
this.textBoxErrorMessage.Size = new System.Drawing.Size(841, 231);
this.textBoxErrorMessage.TabIndex = 5;
this.textBoxErrorMessage.Visible = false;
//
// labelError
//
this.labelError.AutoSize = true;
this.labelError.ForeColor = System.Drawing.Color.Red;
this.labelError.Location = new System.Drawing.Point(13, 88);
this.labelError.Name = "labelError";
this.labelError.Size = new System.Drawing.Size(77, 13);
this.labelError.TabIndex = 4;
this.labelError.Text = "Error message:";
this.labelError.Visible = false;
//
// textBoxDomain
//
this.textBoxDomain.Location = new System.Drawing.Point(144, 50);
this.textBoxDomain.Name = "textBoxDomain";
this.textBoxDomain.ReadOnly = true;
this.textBoxDomain.Size = new System.Drawing.Size(308, 20);
this.textBoxDomain.TabIndex = 1;
//
// textBoxDisplayName
//
this.textBoxDisplayName.Location = new System.Drawing.Point(144, 25);
this.textBoxDisplayName.Name = "textBoxDisplayName";
this.textBoxDisplayName.ReadOnly = true;
this.textBoxDisplayName.Size = new System.Drawing.Size(308, 20);
this.textBoxDisplayName.TabIndex = 0;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(92, 53);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(46, 13);
this.label2.TabIndex = 3;
this.label2.Text = "Domain:";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(12, 28);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(126, 13);
this.label1.TabIndex = 2;
this.label1.Text = "Application display name:";
//
// tabPageTeams
//
this.tabPageTeams.Controls.Add(this.ctrlTabTeams1);
this.tabPageTeams.Location = new System.Drawing.Point(4, 22);
this.tabPageTeams.Name = "tabPageTeams";
this.tabPageTeams.Padding = new System.Windows.Forms.Padding(3);
this.tabPageTeams.Size = new System.Drawing.Size(872, 467);
this.tabPageTeams.TabIndex = 1;
this.tabPageTeams.Text = "MS Teams";
this.tabPageTeams.UseVisualStyleBackColor = true;
//
// ctrlTabTeams1
//
this.ctrlTabTeams1.Dock = System.Windows.Forms.DockStyle.Fill;
this.ctrlTabTeams1.Location = new System.Drawing.Point(3, 3);
this.ctrlTabTeams1.Name = "ctrlTabTeams1";
this.ctrlTabTeams1.Size = new System.Drawing.Size(866, 461);
this.ctrlTabTeams1.TabIndex = 0;
//
// tabPageLiam
//
this.tabPageLiam.Controls.Add(this.ctrlTabLiam1);
this.tabPageLiam.Location = new System.Drawing.Point(4, 22);
this.tabPageLiam.Name = "tabPageLiam";
this.tabPageLiam.Padding = new System.Windows.Forms.Padding(3);
this.tabPageLiam.Size = new System.Drawing.Size(872, 467);
this.tabPageLiam.TabIndex = 2;
this.tabPageLiam.Text = "LIAM";
this.tabPageLiam.UseVisualStyleBackColor = true;
//
// ctrlTabLiam1
//
this.ctrlTabLiam1.Dock = System.Windows.Forms.DockStyle.Fill;
this.ctrlTabLiam1.Location = new System.Drawing.Point(3, 3);
this.ctrlTabLiam1.Name = "ctrlTabLiam1";
this.ctrlTabLiam1.Size = new System.Drawing.Size(866, 461);
this.ctrlTabLiam1.TabIndex = 0;
//
// frmMain
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(880, 493);
this.Controls.Add(this.tabControlLiam);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MinimumSize = new System.Drawing.Size(522, 374);
this.Name = "frmMain";
this.Text = "LIAM test application for MS Teams & Sharepoint";
this.Load += new System.EventHandler(this.frmMain_Load);
this.tabControlLiam.ResumeLayout(false);
this.tabPageLogin.ResumeLayout(false);
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.groupBoxAccount.ResumeLayout(false);
this.groupBoxAccount.PerformLayout();
this.tabPageTeams.ResumeLayout(false);
this.tabPageLiam.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TabControl tabControlLiam;
private System.Windows.Forms.TabPage tabPageLogin;
private System.Windows.Forms.TabPage tabPageTeams;
private System.Windows.Forms.GroupBox groupBoxAccount;
private System.Windows.Forms.TextBox textBoxDomain;
private System.Windows.Forms.TextBox textBoxDisplayName;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox textBoxErrorMessage;
private System.Windows.Forms.Label labelError;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.TextBox textBoxTenant;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.TextBox textBoxClientApp;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Button buttonLogin;
private System.Windows.Forms.TextBox textBoxClientSecret;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.TabPage tabPageLiam;
public ctrlTabLiam ctrlTabTeams1;
public ctrlTabLiam ctrlTabLiam1;
}
}

152
LiamTestTeams/frmMain.cs Normal file
View File

@@ -0,0 +1,152 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using C4IT.Logging;
using C4IT.Security;
using C4IT.LIAM;
namespace LiamTestTeams
{
public partial class frmMain : Form
{
private const string PPH = "uKl0P.&Wz8;?rpTL";
private const string PPK = "f1JtsKzdeOB/rxG7geEwBumb7M0SoH8yMhv0Wi5G29LPpUwGmS6PzcynMnbc8ov5vOId5KJa4gHCDFgwCmXJZbApAG1QCUMwfIJSMaaowPAVcdSWbBHFEL50IpY+/YUKwl/B2pofNi2po0A7ZW00KVa6XFa5CpjFf6EGukwvL0jkEyK+RBoMYrUZWySQB1QS/AEohWCYo8ekcqV5PnBdXHZHyZB2bvK74ePhvJYnTnDUXbOpvEU19iHFzrJ0FxbZt1/2aPcyjHER8GhR7CXkxP2nJbn81bMzqLWQs3Wl1AWH+NbKvEY9+5NgkTqqvkW43Xkm5w8FwoEWIeX4yU50we9H060Dm6g8scyacL1MU0DKjOuxpxCE92fu6kp9DNQpSc6yCcwyzIS7atlwuqJ/N8nhuDcdH6X6hY/wrLgQjIrLi0I4n5vO6fT9hkusPaUHFpZVb2wPkHTJNzw+HF7fvhIROg50s273D5DmGioE0DyxkbJtg63R6LSPy8ok3W91qlD4+6DlPMPJ9ABLttK2ckcnMn/46YVDQ2ABpR7H79XgOf1NYp2WasLbC6KFE1ghpP0GEQughsxeVrNZhsZP351oEuCXVQx6w+iyp3Qv762vZ2vnh2G96drAHuOuLEqF+NZ7SVh3LGpuVE1bQbwd/9S3pdQI3iQcjza3Feoxew3RNaGnnJ63qLPVxc9dSvrRtVNwKOyW8iFdSpf1lHtX8XKPjOXSdhqOwts+Gl/Nn5bQee4uXdkrvxyN7wps1sWQRzkcyLIzplOwH80ZxEoVfgXz6lixMYOKrSly0kSektq6aRemfOBX7TvaQ+f1mgGripjks1UKUdrZG90Lj+WchTzDgxidHYW6z0vjxnO5mtnisryn8KnivpflC4y79/qZJ0ypPXCwKdH5QdvDEOhC2Qj8LX45YoCwanDIVgLbbz5lh9nbIMdH0uBkcbNAzNIjJwUTDWMcgzeeFJiEMKitISA4TpMTuxqKDjuqNa+S8qnYCy6A32O/TFihRIJG25w7khf0gnAdtkrCKOKsHwLKV1bdZxNW/WvA3WYSTIOvQIQsCre0YdqejUAiHLBPfh2ni4JVr2mU0AjulY7tnwsInxl2zR8FrgbziX0TxtXdrzTDMdIfCt1oFkiKUK9mwjlzBQ6Sl5G+wMmf4t8sQw1HTUvy/Ww1uu471+OUZui8npaRuKLG1m4+fvXRxF24YNxWNMCfGTsTOHCcxECwJhxMBDOQ8e6hYcXWDC5qMLnYKm1Gf2EVO5i7/vYtkRmK2SfP9b/Dg4BmW5/LUGEvUL4PT+xQVSHsJ+DZCB16fUfBgxMRoQZfR7U/Q/TCl5m6VCRT0AkcZDy3CiTemXbMylPpUKHURcPEYk6ALJgiuN8CQO+cxYZi16jx7/YJaINMx/855Gj4+fx/gWAdBLVwW2PT4jadx6lk7rwvO/wgPigwtLt6wxeqGbgWy3c2Ikdic7osZCThKD7Z+RPTVdpYudhkhs7Hd1sx+DBbX9fW/sKKONdquvvvKkHYbKV348IVKaMwSS/iSZ0YLwuNPMD3jtBhYoMeub9/SdkegUU0B5P8fA+uDdFppXazTpqgjApSJzkS";
private readonly cLiamTestTeamsConfig Config = new cLiamTestTeamsConfig();
public frmMain()
{
InitializeComponent();
var SP = new cSecurePassword(PPH);
SP.SetRsaKey(PPK, "C4IT_LIAM");
cSecurePassword.Instance = SP;
}
private async void buttonLogin_Click(object sender, EventArgs e)
{
try
{
Cursor = Cursors.WaitCursor;
if (tabControlLiam.TabPages.Contains(tabPageTeams))
tabControlLiam.TabPages.Remove(tabPageTeams);
if (tabControlLiam.TabPages.Contains(tabPageLiam))
tabControlLiam.TabPages.Remove(tabPageLiam);
textBoxDisplayName.Text = "";
textBoxDomain.Text = "";
var Provider = new cLiamProviderData()
{
ProviderType = eLiamProviderTypes.MsTeams,
Domain = textBoxTenant.Text,
Credential = new cLiamCredential()
{
Domain = textBoxTenant.Text,
Identification = textBoxClientApp.Text,
Secret = textBoxClientSecret.Text
}
};
var RootNodeTeams = new TreeNodeMsTeamsRoot(Provider);
if (!await RootNodeTeams.LogonAsync())
{
groupBoxAccount.Text = "- Authentication error -";
labelError.Visible = true;
textBoxErrorMessage.Visible = true;
textBoxErrorMessage.Text = RootNodeTeams.getLastError();
textBoxDisplayName.Text = "";
textBoxDomain.Text = "";
return;
}
else
{
labelError.Visible = false;
textBoxErrorMessage.Visible = false;
groupBoxAccount.Text = "Authenticated";
textBoxDisplayName.Text = RootNodeTeams.ToString();
textBoxDomain.Text = RootNodeTeams.GetInfoText();
}
if (!tabControlLiam.TabPages.Contains(tabPageTeams))
tabControlLiam.TabPages.Add(tabPageTeams);
var RootNodeLiam = new TreeNodeLiamRoot(Provider);
if (await RootNodeLiam.LogonAsync())
{
if (!tabControlLiam.TabPages.Contains(tabPageLiam))
tabControlLiam.TabPages.Add(tabPageLiam);
await ctrlTabLiam1.Refresh(RootNodeLiam);
}
await ctrlTabTeams1.Refresh(RootNodeTeams);
tabPageTeams.Select();
return;
}
catch (Exception E)
{
ShowError(E.Message);
cLogManager.LogException(E);
}
finally
{
Cursor = Cursors.Default;
}
}
private void ShowError(string Message)
{
textBoxErrorMessage.Text = Message;
labelError.Visible = true;
textBoxErrorMessage.Visible = true;
}
private void frmMain_Load(object sender, EventArgs e)
{
Config.Load();
textBoxTenant.Text = Config.Tenant;
textBoxClientApp.Text = Config.ClientAppID;
if (!string.IsNullOrWhiteSpace(Config.ClientSecret))
textBoxClientSecret.Text = cSecurePassword.Instance.Decode(Config.ClientSecret);
ctrlTabLiam1.SetTitle("LIAM nodes:");
ctrlTabTeams1.SetTitle("MS Teams");
tabControlLiam.TabPages.Remove(tabPageTeams);
tabControlLiam.TabPages.Remove(tabPageLiam);
CheckLogin();
}
private void CheckLogin()
{
var enabled = false;
if (!string.IsNullOrEmpty(textBoxTenant.Text))
if (!string.IsNullOrEmpty(textBoxClientApp.Text))
if (!string.IsNullOrEmpty(textBoxClientSecret.Text))
enabled = true;
buttonLogin.Enabled = enabled;
}
private void textBoxInput_TextChanged(object sender, EventArgs e)
{
CheckLogin();
}
}
}

8142
LiamTestTeams/frmMain.resx Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,126 @@
namespace LiamTestTeams
{
partial class frmPermissionInput
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.textBoxEmail = new System.Windows.Forms.TextBox();
this.buttonOK = new System.Windows.Forms.Button();
this.buttonCancel = new System.Windows.Forms.Button();
this.comboBoxRole = new System.Windows.Forms.ComboBox();
this.SuspendLayout();
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(12, 15);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(102, 13);
this.label1.TabIndex = 0;
this.label1.Text = "User e-mail address:";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(49, 43);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(65, 13);
this.label2.TabIndex = 1;
this.label2.Text = "Access role:";
//
// textBoxEmail
//
this.textBoxEmail.Location = new System.Drawing.Point(120, 12);
this.textBoxEmail.Name = "textBoxEmail";
this.textBoxEmail.Size = new System.Drawing.Size(139, 20);
this.textBoxEmail.TabIndex = 2;
this.textBoxEmail.TextChanged += new System.EventHandler(this.textBoxEmail_TextChanged);
//
// buttonOK
//
this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK;
this.buttonOK.Enabled = false;
this.buttonOK.Location = new System.Drawing.Point(52, 81);
this.buttonOK.Name = "buttonOK";
this.buttonOK.Size = new System.Drawing.Size(75, 23);
this.buttonOK.TabIndex = 4;
this.buttonOK.Text = "OK";
this.buttonOK.UseVisualStyleBackColor = true;
//
// buttonCancel
//
this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.buttonCancel.Location = new System.Drawing.Point(157, 81);
this.buttonCancel.Name = "buttonCancel";
this.buttonCancel.Size = new System.Drawing.Size(75, 23);
this.buttonCancel.TabIndex = 5;
this.buttonCancel.Text = "Cancel";
this.buttonCancel.UseVisualStyleBackColor = true;
//
// comboBoxRole
//
this.comboBoxRole.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboBoxRole.FormattingEnabled = true;
this.comboBoxRole.Location = new System.Drawing.Point(120, 40);
this.comboBoxRole.Name = "comboBoxRole";
this.comboBoxRole.Size = new System.Drawing.Size(139, 21);
this.comboBoxRole.TabIndex = 6;
//
// frmPermissionInput
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(290, 118);
this.Controls.Add(this.comboBoxRole);
this.Controls.Add(this.buttonCancel);
this.Controls.Add(this.buttonOK);
this.Controls.Add(this.textBoxEmail);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
this.Name = "frmPermissionInput";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Select permission to add";
this.Load += new System.EventHandler(this.frmPermissionInput_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Button buttonOK;
private System.Windows.Forms.Button buttonCancel;
public System.Windows.Forms.TextBox textBoxEmail;
public System.Windows.Forms.ComboBox comboBoxRole;
}
}

View File

@@ -0,0 +1,43 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace LiamTestTeams
{
public partial class frmPermissionInput : Form
{
public frmPermissionInput()
{
InitializeComponent();
}
private void frmPermissionInput_Load(object sender, EventArgs e)
{
comboBoxRole.SelectedIndex = 0;
}
private void textBoxEmail_TextChanged(object sender, EventArgs e)
{
bool isValid = false;
if (!string.IsNullOrWhiteSpace(textBoxEmail.Text))
{
try
{
var mail = new System.Net.Mail.MailAddress(textBoxEmail.Text.Trim());
isValid = mail != null;
}
catch
{
}
}
buttonOK.Enabled = isValid;
}
}
}

View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")]

View File

@@ -0,0 +1 @@
2f632260cf699d0a9cd328e57cebdb2f7d8a1af17a3b5f120fbbd34441958e98

View File

@@ -0,0 +1,24 @@
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Debug\LiamTestTeams.exe.config
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Debug\LiamTestTeams.exe
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Debug\LiamTestTeams.pdb
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Debug\LiamBaseClasses.dll
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Debug\LiamHelper.dll
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Debug\LiamMsGraph.dll
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Debug\LiamMsTeams.dll
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Debug\Newtonsoft.Json.dll
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Debug\LiamBaseClasses.pdb
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Debug\LiamHelper.pdb
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Debug\LiamMsGraph.pdb
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Debug\LiamMsTeams.pdb
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Debug\LiamTestTeams.csproj.AssemblyReference.cache
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Debug\LiamTestTeams.csproj.SuggestedBindingRedirects.cache
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Debug\LiamTestTeams.exe.config
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Debug\LiamTestTeams.ctrlTabLiam.resources
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Debug\LiamTestTeams.frmMain.resources
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Debug\LiamTestTeams.frmPermissionInput.resources
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Debug\LiamTestTeams.Properties.Resources.resources
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Debug\LiamTestTeams.csproj.GenerateResource.cache
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Debug\LiamTestTeams.csproj.CoreCompileInputs.cache
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Debug\LiamTest.67C85597.Up2Date
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Debug\LiamTestTeams.exe
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Debug\LiamTestTeams.pdb

View File

@@ -0,0 +1 @@
1ca0cc254a718603c74e05772c3db01a91d88ee2c1d09bc07150bf95e8eb18cb

Binary file not shown.

View File

@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.1" newVersion="5.0.0.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Graph.Core" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.24.0.0" newVersion="1.24.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Identity.Client" publicKeyToken="0a613f4dd989e8ae" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.27.0.0" newVersion="4.27.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

Binary file not shown.

View File

@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")]

View File

@@ -0,0 +1 @@
1c3a11131b5f22f88eaf2794057b85cc5ec639dab36b37bded2712dd1af36b0c

View File

@@ -0,0 +1,24 @@
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Release\LiamTestTeams.exe.config
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Release\LiamTestTeams.exe
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Release\LiamTestTeams.pdb
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Release\LiamBaseClasses.dll
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Release\LiamHelper.dll
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Release\LiamMsGraph.dll
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Release\LiamMsTeams.dll
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Release\Newtonsoft.Json.dll
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Release\LiamBaseClasses.pdb
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Release\LiamHelper.pdb
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Release\LiamMsGraph.pdb
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\bin\Release\LiamMsTeams.pdb
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Release\LiamTestTeams.csproj.AssemblyReference.cache
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Release\LiamTestTeams.csproj.SuggestedBindingRedirects.cache
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Release\LiamTestTeams.exe.config
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Release\LiamTestTeams.ctrlTabLiam.resources
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Release\LiamTestTeams.frmMain.resources
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Release\LiamTestTeams.frmPermissionInput.resources
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Release\LiamTestTeams.Properties.Resources.resources
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Release\LiamTestTeams.csproj.GenerateResource.cache
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Release\LiamTestTeams.csproj.CoreCompileInputs.cache
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Release\LiamTest.67C85597.Up2Date
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Release\LiamTestTeams.exe
C:\Workspace\C4IT DEV LIAM WEB Service\LiamTestTeams\obj\Release\LiamTestTeams.pdb

View File

@@ -0,0 +1 @@
1ca0cc254a718603c74e05772c3db01a91d88ee2c1d09bc07150bf95e8eb18cb

Binary file not shown.

View File

@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.1" newVersion="5.0.0.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Graph.Core" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.24.0.0" newVersion="1.24.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Identity.Client" publicKeyToken="0a613f4dd989e8ae" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.27.0.0" newVersion="4.27.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

Binary file not shown.