From b16a4154c2d5d470d04a219be97eccb4e795cebc Mon Sep 17 00:00:00 2001 From: Alexander Wollbrink Date: Fri, 12 Jul 2024 10:02:44 +0200 Subject: [PATCH 01/13] bumped version of Aml.Engine to 3.2.1 --- .DS_Store | Bin 0 -> 8196 bytes src/.DS_Store | Bin 0 -> 6148 bytes src/AasxAmlImExport/AasxAmlImExport.csproj | 4 ++-- src/WpfMtpControl/WpfMtpControl.csproj | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) create mode 100755 .DS_Store create mode 100755 src/.DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100755 index 0000000000000000000000000000000000000000..9b72b315b44b195662e19fc08f4eb38f8bd09c96 GIT binary patch literal 8196 zcmeHMTWl0n7(U-@ff+_%s1ypa?8*uhC}HUZK@_&_R=MA{r57&C?#@U@rZZ({b{A}F z>XQm;;)_N>d^75UmnZ~%RiY-w2ZBU-(Zs|=<;A;+iSa*kW+~-jd@>}RlbrL~jE!3_oe>NJ1cH)lu* z8jfKG!VKJ)0bV{4=CUFyBNVbCD_O06c(}Qx zwK3kjrg@|>KD@Rm*%)tWUOh6R$aRU8>vm@kTZ6W9Tm*n%6JXP>3+TjHG?rWL5MLuA z>HLt0=5jR}WvZ%9i}v*P_3z!6)wGgp>^7{NXO@k0&NJMsHp8XhHWeIuXVEBAP(205 zDh=ACnOVqLg%TMXZI+cW9~IVxqGMS*9oO_s$L{O(jH4dc@rlN%di!0c=ymv$^_n!l zu&U*2>=@$C?jED)5>=Epr_YJq)3BoH-uqLXo3`)1I76FRtEzRgd&;J3<}ITy=N1fG zH|;~+6;t;H`YE5bXFhBiMMas3#x6TIXk4tVpF8ia`O&Db8S|;m(p$=#M@pu5OiReJ zSR=YHp~%{qeL4lX&C&Ucy03{w7cP4)BGy=3H;b zkYUr>JhTTFMx%XP-lpq@P7%zjpIaN<65S?i7vz3-AXhYYR0xSx`7T-Z-!94dOr5&v zIaih4T&bCM*(8wDI}lix6RFcze4rFYh9D(?IoCsIklYy1?8vLtI~o7n+2#E!8O z?0NPIdyk!AXW4o7IlIKZVc)Tz*w5@2_B;CvHJFN7n2$wRf(9%_6PnS2)#$)hY{Pc+ zqW~QS4#7eRWmIqskKqYCiKlP^&*3GU#3`J{t9T1<;~ji}5AhMs<6~UH*Z3Yk;79z5 z-|z?ilp@j{(llwh6qlAt%cSMfdTE2SQQ9T-OIc|^L?BfwYkxJuK>i5PV4tAM3cmA6 zCvRR^v4=Kp+PtOpwymtMrt@05b5`B#Iq^lyR<^8ppzSK+1VF2pycX*|yvG%V4{sj= z*F)1UI(0#;oA7TO9jiJ~h1J^ArtmtIFLLX<)kI92L=_^~#cD%Ln@rUq*yXVmF-@YP z6l^lqq-qf=ImP#Fjjd2M$bwm`u2Z!dDn7xkR~M)nQv}lH1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0false - + @@ -15,7 +15,7 @@ - + diff --git a/src/WpfMtpControl/WpfMtpControl.csproj b/src/WpfMtpControl/WpfMtpControl.csproj index c6a3b9f5a..84684a69f 100644 --- a/src/WpfMtpControl/WpfMtpControl.csproj +++ b/src/WpfMtpControl/WpfMtpControl.csproj @@ -16,7 +16,7 @@ - + From 61076fc4620ff1177b32f2f6f3c474fc4c00a21b Mon Sep 17 00:00:00 2001 From: Alexander Wollbrink Date: Fri, 12 Jul 2024 11:43:37 +0200 Subject: [PATCH 02/13] removing opc related nugets --- src/AasxPluginUaNetClient/AasxPluginUaNetClient.csproj | 2 -- src/AasxPluginUaNetServer/AasxPluginUaNetServer.csproj | 1 - src/AasxRestConsoleServer/AasxRestConsoleServer.csproj | 3 --- src/AasxUaNetConsoleServer/AasxUaNetConsoleServer.csproj | 3 --- src/AasxUaNetServer/AasxUaNetServer.csproj | 1 - src/WpfMtpControl/WpfMtpControl.csproj | 1 - 6 files changed, 11 deletions(-) diff --git a/src/AasxPluginUaNetClient/AasxPluginUaNetClient.csproj b/src/AasxPluginUaNetClient/AasxPluginUaNetClient.csproj index 2b60de449..0d794bb3f 100644 --- a/src/AasxPluginUaNetClient/AasxPluginUaNetClient.csproj +++ b/src/AasxPluginUaNetClient/AasxPluginUaNetClient.csproj @@ -22,7 +22,5 @@ - - diff --git a/src/AasxPluginUaNetServer/AasxPluginUaNetServer.csproj b/src/AasxPluginUaNetServer/AasxPluginUaNetServer.csproj index baad25d03..f4a746efd 100644 --- a/src/AasxPluginUaNetServer/AasxPluginUaNetServer.csproj +++ b/src/AasxPluginUaNetServer/AasxPluginUaNetServer.csproj @@ -55,6 +55,5 @@ - diff --git a/src/AasxRestConsoleServer/AasxRestConsoleServer.csproj b/src/AasxRestConsoleServer/AasxRestConsoleServer.csproj index 436479c9b..7f375ae67 100644 --- a/src/AasxRestConsoleServer/AasxRestConsoleServer.csproj +++ b/src/AasxRestConsoleServer/AasxRestConsoleServer.csproj @@ -5,9 +5,6 @@ false false - - - PreserveNewest diff --git a/src/AasxUaNetConsoleServer/AasxUaNetConsoleServer.csproj b/src/AasxUaNetConsoleServer/AasxUaNetConsoleServer.csproj index 6e6bb5d45..b1d24f335 100644 --- a/src/AasxUaNetConsoleServer/AasxUaNetConsoleServer.csproj +++ b/src/AasxUaNetConsoleServer/AasxUaNetConsoleServer.csproj @@ -16,9 +16,6 @@ PreserveNewest - - - diff --git a/src/AasxUaNetServer/AasxUaNetServer.csproj b/src/AasxUaNetServer/AasxUaNetServer.csproj index 8ab6cade6..57ad1c6b8 100644 --- a/src/AasxUaNetServer/AasxUaNetServer.csproj +++ b/src/AasxUaNetServer/AasxUaNetServer.csproj @@ -8,7 +8,6 @@ - diff --git a/src/WpfMtpControl/WpfMtpControl.csproj b/src/WpfMtpControl/WpfMtpControl.csproj index 84684a69f..a146b0e3a 100644 --- a/src/WpfMtpControl/WpfMtpControl.csproj +++ b/src/WpfMtpControl/WpfMtpControl.csproj @@ -18,6 +18,5 @@ - From 918b52674e78b984dc21d60323147cfe45809286 Mon Sep 17 00:00:00 2001 From: Alexander Wollbrink Date: Fri, 12 Jul 2024 11:44:57 +0200 Subject: [PATCH 03/13] remove AasxPluginUaNetServer --- .DS_Store | Bin 8196 -> 8196 bytes .../AasxPluginUaNetServer.Config.xml | 224 -------------- .../AasxPluginUaNetServer.csproj | 59 ---- .../AasxPluginUaNetServer.options.json | 15 - .../AasxPluginUaNetServer.plugin | 1 - src/AasxPluginUaNetServer/LICENSE.txt | 1 - src/AasxPluginUaNetServer/Plugin.cs | 277 ------------------ .../Properties/AssemblyInfo.cs | 36 --- .../UaNetServerOptions.cs | 43 --- 9 files changed, 656 deletions(-) delete mode 100644 src/AasxPluginUaNetServer/AasxPluginUaNetServer.Config.xml delete mode 100644 src/AasxPluginUaNetServer/AasxPluginUaNetServer.csproj delete mode 100644 src/AasxPluginUaNetServer/AasxPluginUaNetServer.options.json delete mode 100644 src/AasxPluginUaNetServer/AasxPluginUaNetServer.plugin delete mode 100644 src/AasxPluginUaNetServer/LICENSE.txt delete mode 100644 src/AasxPluginUaNetServer/Plugin.cs delete mode 100644 src/AasxPluginUaNetServer/Properties/AssemblyInfo.cs delete mode 100644 src/AasxPluginUaNetServer/UaNetServerOptions.cs diff --git a/.DS_Store b/.DS_Store index 9b72b315b44b195662e19fc08f4eb38f8bd09c96..4681d72119b8a6dfc8cf209d38b326f189a6c819 100755 GIT binary patch delta 20 bcmZp1XmQvuO@Q6Z!c<4W#Ax$efpmTVMArrp delta 20 bcmZp1XmQvuO@Q6l#8gMY*kbcsfpmTVM5G1} diff --git a/src/AasxPluginUaNetServer/AasxPluginUaNetServer.Config.xml b/src/AasxPluginUaNetServer/AasxPluginUaNetServer.Config.xml deleted file mode 100644 index bd5e13525..000000000 --- a/src/AasxPluginUaNetServer/AasxPluginUaNetServer.Config.xml +++ /dev/null @@ -1,224 +0,0 @@ - - - - UA Core Sample Server - urn:localhost:OPCFoundation:CoreSampleServer - http://opcfoundation.org/UA/CoreSampleServer - Server_0 - - - - - - X509Store - CurrentUser\My - CN=UA Core Sample Server, C=US, S=Arizona, O=IDTA, DC=localhost - - - - - Directory - %LocalApplicationData%/OPC Foundation/pki/issuer - - - - - Directory - %LocalApplicationData%/OPC Foundation/pki/trusted - - - - - Directory - %LocalApplicationData%/OPC Foundation/pki/rejected - - - - true - - - - - - - 600000 - 1048576 - 4194304 - 65535 - 4194304 - 65535 - 300000 - 3600000 - - - - - opc.tcp://localhost:51210/UA/SampleServer - - - - - - - - - SignAndEncrypt_3 - http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256 - - - - None_1 - http://opcfoundation.org/UA/SecurityPolicy#None - - - Sign_2 - - - - SignAndEncrypt_3 - - - - - 5 - 100 - 2000 - - - - Anonymous_0 - http://opcfoundation.org/UA/SecurityPolicy#None - - - UserName_1 - - - Certificate_2 - - - - false - 100 - 10000 - 3600000 - 10 - 10 - 100 - 600000 - 100 - 3600000 - 50 - 3600000 - 100 - 100 - 1000 - 1000 - - - - opc.tcp://localhost:4840 - - opc.tcp://localhost:4840 - DiscoveryServer_3 - - opc.tcp://localhost:48400 - - - SignAndEncrypt_3 - - - - - 30000 - Opc.Ua.Server.nodes.xml - - 20 - 100 - 10000 - 10000 - - - - Standard UA Server Profile - Data Access Server Facet - Method Server Facet - - 2 - - DA - - - PFX - PEM - - 0 - false - - - - - - - - - UInt32 - 100 - UInt32 - - - Double - 100 - Double - - - - - - - - %LocalApplicationData%/Logs/Opc.Ua.CoreSampleServer.log.txt - true - - - - - - - - - - - - - - - - true - - \ No newline at end of file diff --git a/src/AasxPluginUaNetServer/AasxPluginUaNetServer.csproj b/src/AasxPluginUaNetServer/AasxPluginUaNetServer.csproj deleted file mode 100644 index f4a746efd..000000000 --- a/src/AasxPluginUaNetServer/AasxPluginUaNetServer.csproj +++ /dev/null @@ -1,59 +0,0 @@ - - - net6.0-windows - Library - false - - true - false - - - - - true - - - - - - - - - PreserveNewest - - - PreserveNewest - - - - - PreserveNewest - - - PreserveNewest - - - - - - diff --git a/src/AasxPluginUaNetServer/AasxPluginUaNetServer.options.json b/src/AasxPluginUaNetServer/AasxPluginUaNetServer.options.json deleted file mode 100644 index e54e27db3..000000000 --- a/src/AasxPluginUaNetServer/AasxPluginUaNetServer.options.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - /* This plug-ins comes with this sample options to show, how multiple Submodel semantic ids can - be matched. This could be used, e.g., to enable a general "operational data" with this feature. */ - "Args": [ - "-single-nodeids", // recommended for SiOME & Open62541 - "-single-keys", // recommended for SiOME & Open62541 - // "-add-root-item", // do not use! - "-link-root-as-component", // recommended for SiOME & Open62541 - "-simple-data-types", - "-ns", - "2", - "-ns", - "3" - ] -} \ No newline at end of file diff --git a/src/AasxPluginUaNetServer/AasxPluginUaNetServer.plugin b/src/AasxPluginUaNetServer/AasxPluginUaNetServer.plugin deleted file mode 100644 index 3beebdf2d..000000000 --- a/src/AasxPluginUaNetServer/AasxPluginUaNetServer.plugin +++ /dev/null @@ -1 +0,0 @@ -This file tags the according .ddl to be a plug-in for AasxPackageExplorer. \ No newline at end of file diff --git a/src/AasxPluginUaNetServer/LICENSE.txt b/src/AasxPluginUaNetServer/LICENSE.txt deleted file mode 100644 index e41b57159..000000000 --- a/src/AasxPluginUaNetServer/LICENSE.txt +++ /dev/null @@ -1 +0,0 @@ -Please see LICENSE.txt of the AASX Package Explorer main application. \ No newline at end of file diff --git a/src/AasxPluginUaNetServer/Plugin.cs b/src/AasxPluginUaNetServer/Plugin.cs deleted file mode 100644 index 4ae0164a4..000000000 --- a/src/AasxPluginUaNetServer/Plugin.cs +++ /dev/null @@ -1,277 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using AasOpcUaServer; -using AasxUaNetServer; -using AdminShellNS; -using Newtonsoft.Json; -using Opc.Ua; -using Opc.Ua.Configuration; -using Opc.Ua.Server; - -namespace AasxIntegrationBase // the namespace has to be: AasxIntegrationBase -{ - // the class names has to be: AasxPlugin and subclassing IAasxPluginInterface - // ReSharper disable once UnusedType.Global - public class AasxPlugin : AasxPluginBase - { - #region // Plug In - private AasxUaNetServer.UaNetServerOptions _options = new AasxUaNetServer.UaNetServerOptions(); - private bool _stop = false; - private UaServerWrapper _server = null; - // dead-csharp off - /* TODO (MIHO, 2021-11-17): damned, weird dependency reasons between - * - * .net6.0 and .net472 seem NOT TO ALLOW referring to AasxIntegrationBase. - * Fix */ - //private static T LoadDefaultOptionsFromAssemblyDirXXXX( - // string pluginName, Assembly assy = null, - // JsonSerializerSettings settings = null) where T : AasxPluginOptionsBase - //{ - // // expand assy? - // if (assy == null) - // assy = Assembly.GetExecutingAssembly(); - // if (pluginName == null || pluginName == "") - // return null; - - // // build fn - // var optfn = System.IO.Path.Combine( - // System.IO.Path.GetDirectoryName(assy.Location), - // pluginName + ".options.json"); - - // if (File.Exists(optfn)) - // { - // var optText = File.ReadAllText(optfn); - - // return Newtonsoft.Json.JsonConvert.DeserializeObject(optText, settings); - // } - - // // no - // return null; - //} - // dead-csharp on - - public new void InitPlugin(string[] args) - { - PluginName = "AasxPluginUaNetServer"; - _log.Info("InitPlugin() called with args = {0}", (args == null) ? "" : string.Join(", ", args)); - - // .. with built-in options - _options = AasxUaNetServer.UaNetServerOptions.CreateDefault(); - - // try load defaults options from assy directory - try - { - var newOpt = - AasxPluginOptionsBase - .LoadDefaultOptionsFromAssemblyDir( - this.GetPluginName(), Assembly.GetExecutingAssembly()); - if (newOpt != null) - this._options = newOpt; - } - catch (Exception ex) - { - _log?.Error(ex, "Exception when reading default options {1}"); - } - - // index them! - _options.IndexListOfRecords(_options.Records); - } - - public new AasxPluginActionDescriptionBase[] ListActions() - { - var res = ListActionsBasicHelper( - enableCheckVisualExt: false, - enableLicenses: true); - res.Add(new AasxPluginActionDescriptionBase("server-start", "Start OPC UA Server for AASX.")); - res.Add(new AasxPluginActionDescriptionBase("server-stop", "Stops server function.")); - return res.ToArray(); - } - - public new AasxPluginResultBase ActivateAction(string action, params object[] args) - { - if (action == "get-licenses") - { - var lic = new AasxPluginResultLicense(); - lic.shortLicense = - "This application uses the OPC Foundation .NET Standard stack. See: OPC REDISTRIBUTABLES " - + "Agreement of Use." + Environment.NewLine + - "The OPC UA Example Code of OPC UA Standard is licensed under the MIT license (MIT)."; - - lic.isStandardLicense = true; - lic.longLicense = AasxPluginHelper.LoadLicenseTxtFromAssemblyDir( - "LICENSE.txt", Assembly.GetExecutingAssembly()); - - return lic; - } - - if (action == "server-stop") - this._stop = true; - - if (action == "server-start") - { - // init - this._stop = false; - _log.Info("Starting OPC UA AASX Server. Based on the OPC Foundation UA Net Standard stack."); - _log.Info("Copyright (c) 2018-2023 Festo SE & Co. KG " + - ", author: Michael Hoffmeister."); - _log.Info("Portions copyright (c) by OPC Foundation, Inc. and licensed under the Reciprocal " - + "Community License (RCL)."); - _log.Info("See https://opcfoundation.org/license/rcl.html."); - - // access AASX - if (args == null || args.Length < 1) - { - _log.Info("No AASX package environment passed to plug-in. Stopping..."); - System.Threading.Thread.Sleep(5000); - return null; - } - - var package = args[0] as AdminShellPackageEnv; - if (package == null) - { - _log.Info("No AASX package environment passed to plug-in. Stopping..."); - System.Threading.Thread.Sleep(5000); - return null; - } - _log.Info("AASX package env has filename {0}", package.Filename); - - // configure UA here a little bit - ApplicationInstance.MessageDlg = new ApplicationMessageDlg(_log); - - // arguments - var externalOptions = new List(); - if (_options?.Args != null) - foreach (var o1 in _options.Args) - externalOptions.Add(o1); - - if (args.Length >= 2 && args[1] is string[]) - { - var pluginArgs = args[1] as string[]; - if (pluginArgs != null && pluginArgs.Length > 0) - { - foreach (var o2 in pluginArgs) - externalOptions.Add(o2); - } - } - - // debug - var lstr = $"Taking over {externalOptions.Count} arguments: "; - foreach (var ls in externalOptions) - lstr += ls + " "; - _log.Info("{0}", lstr); - - // parse - var internalOptions = new AasOpcUaServer.AasxUaServerOptions(); - internalOptions.ParseArgs(externalOptions.ToArray()); - - // run the server - try - { - this._server = new UaServerWrapper(_stopTimeout: 0, _aasxEnv: package, logger: _log, _serverOptions: internalOptions); - this._server.Run(); - } - catch (Exception ex) - { - _log.Info("Exception whenn running server: {0}", ex.Message); - } - - // do as long as user wants - int i = 0; - while (true) - { - if (this._stop) - { - _log.Info("Stopping ..."); - if (this._server != null) - this._server.Stop(); - break; - } - - //TODO (MIHO, 0000-00-00): Temporary disabled - // seems not to work anymore - ////if (this.server != null && this.server.IsNotRunningAnymore()) - //// break; - - // new option - if (true == this._server?.FinallyStopped) - break; - - System.Threading.Thread.Sleep(50); - if (i % 200 == 0) - _log.Info("Heartbeat {0} x 50ms ..", i); - i++; - } - _log.Info("Stopped."); - } - - var res = new AasxPluginResultBase(); - return res; - } - - } - - #endregion - - #region // taken form Net46 Console Server - // - // - // - - public class ApplicationMessageDlg : IApplicationMessageDlg - { - private LogInstance logger = null; - private string message = string.Empty; - private bool ask = false; - - public ApplicationMessageDlg(LogInstance logger) - { - this.logger = logger; - } - - public override void Message(string text, bool ask = false) - { - this.message = text; - this.ask = ask; - } - - public override async Task ShowAsync() - { - if (ask) - { - message += " (y/n, default y): "; - logger.Info("{0}", message); - Console.Write(message); - } - else - { - logger.Info("{0}", message); - Console.WriteLine(message); - } - if (ask) - { - // always say yes! - return await Task.FromResult(true); - } - return await Task.FromResult(true); - } - } - - - - #endregion -} diff --git a/src/AasxPluginUaNetServer/Properties/AssemblyInfo.cs b/src/AasxPluginUaNetServer/Properties/AssemblyInfo.cs deleted file mode 100644 index 754b62d7b..000000000 --- a/src/AasxPluginUaNetServer/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die einer Assembly zugeordnet sind. -[assembly: AssemblyTitle("AasxPluginUaNetServer")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("AasxPluginUaNetServer")] -[assembly: AssemblyCopyright("Copyright © 2020")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly -// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von -// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. -[assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird -[assembly: Guid("32eede14-8622-42e6-81ae-33941b7a6efc")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, -// indem Sie "*" wie unten gezeigt eingeben: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/AasxPluginUaNetServer/UaNetServerOptions.cs b/src/AasxPluginUaNetServer/UaNetServerOptions.cs deleted file mode 100644 index f3f9ac144..000000000 --- a/src/AasxPluginUaNetServer/UaNetServerOptions.cs +++ /dev/null @@ -1,43 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Aas = AasCore.Aas3_0; -using AdminShellNS; -using AasxIntegrationBase; - -// ReSharper disable ClassNeverInstantiated.Global -// ReSharper disable UnassignedField.Global - -namespace AasxUaNetServer -{ - public class UaNetServerOptionsRecord : AasxPluginOptionsLookupRecordBase - { - } - - public class UaNetServerOptions : AasxPluginLookupOptionsBase - { - public string[] Args; - - public List Records = new List(); - - /// - /// Create a set of minimal options - /// - public static UaNetServerOptions CreateDefault() - { - var opt = new UaNetServerOptions(); - return opt; - } - } -} From 6dfa006d72ceb788cfc38d2fd8cb80087f055a1b Mon Sep 17 00:00:00 2001 From: Alexander Wollbrink Date: Fri, 12 Jul 2024 11:45:23 +0200 Subject: [PATCH 04/13] remove AasxPluginUaNetClient --- .../AasxPluginUaNetClient.csproj | 26 --- .../AasxPluginUaNetClient.plugin | 1 - src/AasxPluginUaNetClient/ExitCode.cs | 33 --- src/AasxPluginUaNetClient/LICENSE.txt | 1 - src/AasxPluginUaNetClient/Plugin.cs | 141 ------------ .../Properties/AssemblyInfo.cs | 36 --- .../Properties/Settings.Designer.cs | 26 --- .../Properties/Settings.settings | 6 - src/AasxPluginUaNetClient/UASampleClient.cs | 206 ------------------ 9 files changed, 476 deletions(-) delete mode 100644 src/AasxPluginUaNetClient/AasxPluginUaNetClient.csproj delete mode 100644 src/AasxPluginUaNetClient/AasxPluginUaNetClient.plugin delete mode 100644 src/AasxPluginUaNetClient/ExitCode.cs delete mode 100644 src/AasxPluginUaNetClient/LICENSE.txt delete mode 100644 src/AasxPluginUaNetClient/Plugin.cs delete mode 100644 src/AasxPluginUaNetClient/Properties/AssemblyInfo.cs delete mode 100644 src/AasxPluginUaNetClient/Properties/Settings.Designer.cs delete mode 100644 src/AasxPluginUaNetClient/Properties/Settings.settings delete mode 100644 src/AasxPluginUaNetClient/UASampleClient.cs diff --git a/src/AasxPluginUaNetClient/AasxPluginUaNetClient.csproj b/src/AasxPluginUaNetClient/AasxPluginUaNetClient.csproj deleted file mode 100644 index 0d794bb3f..000000000 --- a/src/AasxPluginUaNetClient/AasxPluginUaNetClient.csproj +++ /dev/null @@ -1,26 +0,0 @@ - - - net6.0-windows - Library - AasxIntegrationBase - false - true - false - - - - PreserveNewest - - - - - - - - PreserveNewest - - - - - - diff --git a/src/AasxPluginUaNetClient/AasxPluginUaNetClient.plugin b/src/AasxPluginUaNetClient/AasxPluginUaNetClient.plugin deleted file mode 100644 index 3beebdf2d..000000000 --- a/src/AasxPluginUaNetClient/AasxPluginUaNetClient.plugin +++ /dev/null @@ -1 +0,0 @@ -This file tags the according .ddl to be a plug-in for AasxPackageExplorer. \ No newline at end of file diff --git a/src/AasxPluginUaNetClient/ExitCode.cs b/src/AasxPluginUaNetClient/ExitCode.cs deleted file mode 100644 index 539d7b9db..000000000 --- a/src/AasxPluginUaNetClient/ExitCode.cs +++ /dev/null @@ -1,33 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace SampleClient -{ - - public enum ExitCode - { - Ok = 0, - ErrorCreateApplication = 0x11, - ErrorDiscoverEndpoints = 0x12, - ErrorCreateSession = 0x13, - ErrorBrowseNamespace = 0x14, - ErrorCreateSubscription = 0x15, - ErrorMonitoredItem = 0x16, - ErrorAddSubscription = 0x17, - ErrorRunning = 0x18, - ErrorNoKeepAlive = 0x30, - ErrorInvalidCommandLine = 0x100 - }; -} diff --git a/src/AasxPluginUaNetClient/LICENSE.txt b/src/AasxPluginUaNetClient/LICENSE.txt deleted file mode 100644 index e41b57159..000000000 --- a/src/AasxPluginUaNetClient/LICENSE.txt +++ /dev/null @@ -1 +0,0 @@ -Please see LICENSE.txt of the AASX Package Explorer main application. \ No newline at end of file diff --git a/src/AasxPluginUaNetClient/Plugin.cs b/src/AasxPluginUaNetClient/Plugin.cs deleted file mode 100644 index 0334c6902..000000000 --- a/src/AasxPluginUaNetClient/Plugin.cs +++ /dev/null @@ -1,141 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG , -Author: Michael Hoffmeister. - -Copyright (c) 2019 Phoenix Contact GmbH & Co. KG <> -Author: Andreas Orzelski - -For OPC Content: - -Copyright (c) 1996-2016, OPC Foundation. All rights reserved. -The source code in this file is covered under a dual-license scenario: - - RCL: for OPC Foundation members in good-standing - - GPL V2: everybody else -RCL license terms accompanied with this source code. See http://opcfoundation.org/License/RCL/1.00/ -GNU General Public License as published by the Free Software Foundation -version 2 of the License are accompanied with this source code. See http://opcfoundation.org/License/GPLv2 -This source code is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; - -namespace AasxIntegrationBase // the namespace has to be: AasxIntegrationBase -{ - // the class names has to be: AasxPlugin and subclassing IAasxPluginInterface - // ReSharper disable once UnusedType.Global - public class AasxPlugin : AasxPluginBase - { - public new void InitPlugin(string[] args) - { - PluginName = "AasxPluginOpcUaClient"; - _log.Info("InitPlugin() called with args = {0}", (args == null) ? "" : string.Join(", ", args)); - } - - public AasxPluginActionDescriptionBase[] ListActions() - { - var res = ListActionsBasicHelper( - enableCheckVisualExt: false, - enableLicenses: true); - res.Add(new AasxPluginActionDescriptionBase("create-client", - "Creates a OPC UA client and returns as plain object. Arguments: (string _endpointURL, " - + "bool _autoAccept, int _stopTimeout, string _userName, string _password).")); - res.Add(new AasxPluginActionDescriptionBase("read-sme-value", - "Reads a value and returns as plain object. Arguments: (UASampleClient client, string nodeName, " - + "int index).")); - return res.ToArray(); - } - - public new AasxPluginResultBase ActivateAction(string action, params object[] args) - { - if (action == "get-licenses") - { - var lic = new AasxPluginResultLicense(); - lic.shortLicense = - "This application uses the OPC Foundation .NET Standard stack. See: OPC REDISTRIBUTABLES " - + "Agreement of Use." + Environment.NewLine + - "The OPC UA Example Code of OPC UA Standard is licensed under the MIT license (MIT)."; - - lic.isStandardLicense = true; - lic.longLicense = AasxPluginHelper.LoadLicenseTxtFromAssemblyDir( - "LICENSE.txt", Assembly.GetExecutingAssembly()); - - return lic; - } - - if (action == "create-client") - { - // OPC Copyright - MessageBox.Show( - "Copyright (c) 2018-2023 PHOENIX CONTACT GmbH & Co. KG , " + - "author: Andreas Orzelski\n\n" + - "Portions copyright (c) by OPC Foundation, Inc. and licensed under the Reciprocal Community " + - "License (RCL)\n" + "see https://opcfoundation.org/license/rcl.html", - "Plugin Notice" - ); - - // check for arguments - if (args == null || args.Length != 5 || !(args[0] is string && args[1] is bool && args[2] is int - && args[3] is string && args[4] is string)) - { - _log.Info("create-client() call with wrong arguments. Expected: (string _endpointURL, " - + "bool _autoAccept, int _stopTimeout, string _userName, string _password)"); - return null; - } - - // re-establish arguments - var _endpointURL = args[0] as string; - var _autoAccept = (bool)args[1]; - var _stopTimeout = (int)args[2]; - var _userName = args[3] as string; - var _password = args[4] as string; - - // make client - var client = new SampleClient.UASampleClient(_endpointURL, _autoAccept, _stopTimeout, - _userName, _password); - client.ConsoleSampleClient().Wait(); - - // return as plain object - var res = new AasxPluginResultBaseObject(); - res.strType = "UASampleClient"; - res.obj = client; - return res; - } - - if (action == "read-sme-value") - { - // check for arguments - if (args == null || args.Length != 3 || !(args[0] is SampleClient.UASampleClient - && args[1] is string && args[2] is int)) - { - _log.Info("read-sme-value() call with wrong arguments. Expected: (UASampleClient client, " - + "string nodeName, int index)"); - return null; - } - - // re-establish arguments - var client = args[0] as SampleClient.UASampleClient; - var nodeName = args[1] as string; - var Namespace = (int)args[2]; - - // make the call - var value = client?.ReadSubmodelElementValue(nodeName, Namespace); - - // return as plain object - var res = new AasxPluginResultBaseObject(); - res.strType = "value object"; - res.obj = value; - return res; - } - - return null; - } - } -} diff --git a/src/AasxPluginUaNetClient/Properties/AssemblyInfo.cs b/src/AasxPluginUaNetClient/Properties/AssemblyInfo.cs deleted file mode 100644 index 08be6b047..000000000 --- a/src/AasxPluginUaNetClient/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die einer Assembly zugeordnet sind. -[assembly: AssemblyTitle("AasxPluginOpcUaClient")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("AasxPluginOpcUaClient")] -[assembly: AssemblyCopyright("Copyright © 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly -// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von -// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. -[assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird -[assembly: Guid("9eb71e8b-ec41-4054-bab4-f419b4d13a36")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, -// indem Sie "*" wie unten gezeigt eingeben: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/AasxPluginUaNetClient/Properties/Settings.Designer.cs b/src/AasxPluginUaNetClient/Properties/Settings.Designer.cs deleted file mode 100644 index f16feb8a0..000000000 --- a/src/AasxPluginUaNetClient/Properties/Settings.Designer.cs +++ /dev/null @@ -1,26 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Dieser Code wurde von einem Tool generiert. -// Laufzeitversion:4.0.30319.42000 -// -// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn -// der Code erneut generiert wird. -// -//------------------------------------------------------------------------------ - -namespace AasxIntegrationBase.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.3.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; - } - } - } -} diff --git a/src/AasxPluginUaNetClient/Properties/Settings.settings b/src/AasxPluginUaNetClient/Properties/Settings.settings deleted file mode 100644 index 049245f40..000000000 --- a/src/AasxPluginUaNetClient/Properties/Settings.settings +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/AasxPluginUaNetClient/UASampleClient.cs b/src/AasxPluginUaNetClient/UASampleClient.cs deleted file mode 100644 index 0fe1261bd..000000000 --- a/src/AasxPluginUaNetClient/UASampleClient.cs +++ /dev/null @@ -1,206 +0,0 @@ -// TODO (MIHO, 2020-08-06): lookup SOURCE! - -/* Copyright (c) 1996-2016, OPC Foundation. All rights reserved - The source code in this file is covered under a dual-license scenario - - RCL: for OPC Foundation members in good-standing - - GPL V2: everybody else - RCL license terms accompanied with this source code. See http://opcfoundation.org/License/RCL/1.00/ - GNU General Public License as published by the Free Software Foundation - version 2 of the License are accompanied with this source code. See http://opcfoundation.org/License/GPLv2 - This source code is distributed in the hope that it will be useful - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE -*/ - -using System; -using System.Threading; -using System.Threading.Tasks; -using AdminShellNS; -using Opc.Ua; -using Opc.Ua.Client; -using Opc.Ua.Configuration; - -namespace SampleClient -{ - public class UASampleClient - { - const int ReconnectPeriod = 10; - ISession session; - SessionReconnectHandler reconnectHandler; - string endpointURL; - int clientRunTime = Timeout.Infinite; - static bool autoAccept = true; - static ExitCode exitCode; - string userName; - string password; - - public UASampleClient(string _endpointURL, bool _autoAccept, int _stopTimeout, - string _userName, string _password) - { - endpointURL = _endpointURL; - autoAccept = _autoAccept; - clientRunTime = _stopTimeout <= 0 ? Timeout.Infinite : _stopTimeout * 1000; - userName = _userName; - password = _password; - } - - public void Run() - { - try - { - ConsoleSampleClient().Wait(); - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); - return; - } - - ManualResetEvent quitEvent = new ManualResetEvent(false); - try - { - Console.CancelKeyPress += (sender, eArgs) => - { - quitEvent.Set(); - eArgs.Cancel = true; - }; - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); - } - - // wait for timeout or Ctrl-C - quitEvent.WaitOne(clientRunTime); - - // return error conditions - if (session.KeepAliveStopped) - { - exitCode = ExitCode.ErrorNoKeepAlive; - return; - } - - exitCode = ExitCode.Ok; - } - - public static ExitCode ExitCode { get => exitCode; } - - public async Task ConsoleSampleClient() - { - Console.WriteLine("1 - Create an Application Configuration."); - exitCode = ExitCode.ErrorCreateApplication; - - ApplicationInstance application = new ApplicationInstance - { - ApplicationName = "UA Core Sample Client", - ApplicationType = ApplicationType.Client, - ConfigSectionName = Utils.IsRunningOnMono() ? "Opc.Ua.MonoSampleClient" : "Opc.Ua.SampleClient" - }; - - // load the application configuration. - ApplicationConfiguration config = await application.LoadApplicationConfiguration(false); - - // check the application certificate. - bool haveAppCertificate = await application.CheckApplicationInstanceCertificate(false, 0); - if (!haveAppCertificate) - { - throw new Exception("Application instance certificate invalid!"); - } - - config.ApplicationUri = X509Utils.GetApplicationUriFromCertificate( - config.SecurityConfiguration.ApplicationCertificate.Certificate); - if (config.SecurityConfiguration.AutoAcceptUntrustedCertificates) - { - autoAccept = true; - } - config.CertificateValidator.CertificateValidation += - // ReSharper disable once RedundantDelegateCreation - new CertificateValidationEventHandler(CertificateValidator_CertificateValidation); - - Console.WriteLine("2 - Discover endpoints of {0}.", endpointURL); - exitCode = ExitCode.ErrorDiscoverEndpoints; - var selectedEndpoint = CoreClientUtils.SelectEndpoint(endpointURL, true, 15000); - Console.WriteLine(" Selected endpoint uses: {0}", - selectedEndpoint.SecurityPolicyUri.Substring(selectedEndpoint.SecurityPolicyUri.LastIndexOf('#') + 1)); - - Console.WriteLine("3 - Create a session with OPC UA server."); - exitCode = ExitCode.ErrorCreateSession; - var endpointConfiguration = EndpointConfiguration.Create(config); - var endpoint = new ConfiguredEndpoint(null, selectedEndpoint, endpointConfiguration); - - session = await Session.Create(config, endpoint, false, "OPC UA Console Client", 60000, - new UserIdentity(userName, password), null); - - // register keep alive handler - session.KeepAlive += Client_KeepAlive; - } - - private void Client_KeepAlive(ISession sender, KeepAliveEventArgs e) - { - if (e.Status != null && ServiceResult.IsNotGood(e.Status)) - { - Console.WriteLine("{0} {1}/{2}", e.Status, sender.OutstandingRequestCount, sender.DefunctRequestCount); - - if (reconnectHandler == null) - { - Console.WriteLine("--- RECONNECTING ---"); - reconnectHandler = new SessionReconnectHandler(); - reconnectHandler.BeginReconnect(sender, ReconnectPeriod * 1000, Client_ReconnectComplete); - } - } - } - - private void Client_ReconnectComplete(object sender, EventArgs e) - { - // ignore callbacks from discarded objects. - if (!Object.ReferenceEquals(sender, reconnectHandler)) - { - return; - } - - if (reconnectHandler != null) - { - session = reconnectHandler.Session; - reconnectHandler.Dispose(); - } - - reconnectHandler = null; - - Console.WriteLine("--- RECONNECTED ---"); - } - - private static void OnNotification(MonitoredItem item, MonitoredItemNotificationEventArgs e) - { - foreach (var value in item.DequeueValues()) - { - Console.WriteLine("{0}: {1}, {2}, {3}", item.DisplayName, value.Value, value.SourceTimestamp, - value.StatusCode); - } - } - - private static void CertificateValidator_CertificateValidation(CertificateValidator validator, - CertificateValidationEventArgs e) - { - if (e.Error.StatusCode == StatusCodes.BadCertificateUntrusted) - { - e.Accept = autoAccept; - if (autoAccept) - { - Console.WriteLine("Accepted Certificate: {0}", e.Certificate.Subject); - } - else - { - Console.WriteLine("Rejected Certificate: {0}", e.Certificate.Subject); - } - } - } - - public string ReadSubmodelElementValue(string nodeName, int index) - - { - NodeId node = new NodeId(nodeName, (ushort)index); - return (session.ReadValue(node).ToString()); - } - - } -} From 6bcc6d20761f319d7648fa451e22abb69ddad605 Mon Sep 17 00:00:00 2001 From: Alexander Wollbrink Date: Fri, 12 Jul 2024 11:46:05 +0200 Subject: [PATCH 05/13] remove AasxUaNetServer --- .../AasxServer/AasEntityBuilder.cs | 716 ------ .../AasxServer/AasEntityDescriptions.cs | 131 -- .../AasxServer/AasNodeManager.cs | 335 --- .../AasxServer/AasUaEntities.cs | 1951 ----------------- .../AasxServer/AasUaEntityFileType.cs | 392 ---- .../AasxServer/AasUaNodeHelper.cs | 179 -- src/AasxUaNetServer/AasxServer/AasUaUtils.cs | 223 -- .../AasxServer/AasxUaServerOptions.cs | 140 -- src/AasxUaNetServer/AasxUaNetServer.csproj | 21 - src/AasxUaNetServer/LICENSE.txt | 1475 ------------- .../Properties/AssemblyInfo.cs | 36 - src/AasxUaNetServer/SampleServer.cs | 105 - src/AasxUaNetServer/UaServerWrapper.cs | 282 --- 13 files changed, 5986 deletions(-) delete mode 100644 src/AasxUaNetServer/AasxServer/AasEntityBuilder.cs delete mode 100644 src/AasxUaNetServer/AasxServer/AasEntityDescriptions.cs delete mode 100644 src/AasxUaNetServer/AasxServer/AasNodeManager.cs delete mode 100644 src/AasxUaNetServer/AasxServer/AasUaEntities.cs delete mode 100644 src/AasxUaNetServer/AasxServer/AasUaEntityFileType.cs delete mode 100644 src/AasxUaNetServer/AasxServer/AasUaNodeHelper.cs delete mode 100644 src/AasxUaNetServer/AasxServer/AasUaUtils.cs delete mode 100644 src/AasxUaNetServer/AasxServer/AasxUaServerOptions.cs delete mode 100644 src/AasxUaNetServer/AasxUaNetServer.csproj delete mode 100644 src/AasxUaNetServer/LICENSE.txt delete mode 100644 src/AasxUaNetServer/Properties/AssemblyInfo.cs delete mode 100644 src/AasxUaNetServer/SampleServer.cs delete mode 100644 src/AasxUaNetServer/UaServerWrapper.cs diff --git a/src/AasxUaNetServer/AasxServer/AasEntityBuilder.cs b/src/AasxUaNetServer/AasxServer/AasEntityBuilder.cs deleted file mode 100644 index cf1955f18..000000000 --- a/src/AasxUaNetServer/AasxServer/AasEntityBuilder.cs +++ /dev/null @@ -1,716 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using AdminShellNS; -using AdminShell_V20; -using Opc.Ua; -using Extensions; -using Aas = AasCore.Aas3_0; - -namespace AasOpcUaServer -{ - public class AasEntityBuilder - { - //// Static singleton for AAS entity builders - // ugly, but simple: the singleton variables gives access to information - // - public static AasNodeManager nodeMgr = null; - - public AdminShellPackageEnv package = null; - - public AasxUaServerOptions theServerOptions = null; - - public IDictionary> nodeMgrExternalReferences = null; - - /// - /// Root of AASes - /// - public NodeState RootAAS = null; - - /// - /// Root for CDs - /// - public NodeState RootConceptDescriptions = null; - - /// - /// Root for DataSpecifications - /// - public NodeState RootDataSpecifications = null; - - /// - /// Provide a root node, if semantic ids shall create missing dictionary entry (targets), - /// which can not be found in the AAS environment. - /// - public NodeState RootMissingDictionaryEntries = null; - - public AasEntityBuilder(AasNodeManager nodeMgr, AdminShellPackageEnv package, - IDictionary> externalReferences, AasxUaServerOptions options) - { - AasEntityBuilder.nodeMgr = nodeMgr; - this.package = package; - this.nodeMgrExternalReferences = externalReferences; - this.aasTypes = new AasTypeEntities(); - this.theServerOptions = options; - this.aasTypes.BuildEntites(this); - } - - public class NodeRecord - { - public NodeState uanode = null; - public Aas.IReferable referable = null; - public string id = ""; - - public NodeRecord() { } - public NodeRecord(NodeState uanode, Aas.IReferable referable) - { - this.uanode = uanode; - this.referable = referable; - } - public NodeRecord(NodeState uanode, string id) - { - this.uanode = uanode; - this.id = id; - } - } - - private Dictionary NodeRecordFromReferable - = new Dictionary(); - private Dictionary NodeRecordFromIdentificationHash - = new Dictionary(); - - /// - /// Use this function always to remeber new node records. - /// - /// - public void AddNodeRecord(NodeRecord nr) - { - if (nr.referable != null && !NodeRecordFromReferable.ContainsKey(nr.referable)) - NodeRecordFromReferable.Add(nr.referable, nr); - - if (nr.id != null) - { - var hash = "" + nr.id.Trim().ToUpper(); - if (!NodeRecordFromIdentificationHash.ContainsKey(hash)) - NodeRecordFromIdentificationHash.Add(hash, nr); - } - } - - /// - /// Use this always to lookup node records from Referable - /// - /// - /// - public NodeRecord LookupNodeRecordFromReferable(Aas.IReferable referable) - { - if (NodeRecordFromReferable == null || !NodeRecordFromReferable.ContainsKey(referable)) - return null; - return NodeRecordFromReferable[referable]; - } - - /// - /// Use this always to lookup node records from Indentifiable - /// - /// - /// - public NodeRecord LookupNodeRecordFromIdentification(Aas.IIdentifiable identification) - { - var hash = "" + identification.Id.Trim().ToUpper(); - if (NodeRecordFromReferable == null || !NodeRecordFromIdentificationHash.ContainsKey(hash)) - return null; - return NodeRecordFromIdentificationHash[hash]; - } - - /// - /// Use this always to lookup node records from Indentifiable - /// - /// - /// - public NodeRecord LookupNodeRecordFromId(string id) - { - var hash = "" + id?.Trim().ToUpper(); - if (NodeRecordFromReferable == null || !NodeRecordFromIdentificationHash.ContainsKey(hash)) - return null; - return NodeRecordFromIdentificationHash[hash]; - } - - /// - /// Base class for actions, which shall be done on the 2nd pass of the information model building - /// - public class NodeLateAction - { - public NodeState uanode = null; - } - - /// - /// Make a late reference to another node identified by a AAS reference information - /// - public class NodeLateActionLinkToReference : NodeLateAction - { - public enum ActionType { None, SetAasReference, SetDictionaryEntry } - - public Aas.IReference targetReference = null; - public ActionType actionType = ActionType.None; - - public NodeLateActionLinkToReference(NodeState uanode, Aas.IReference targetReference, - ActionType actionType) - { - this.uanode = uanode; - this.targetReference = targetReference; - this.actionType = actionType; - } - } - - private List noteLateActions = new List(); - - /// - /// Add a late action, which will be processed as 2nd phase of info model preparation - /// - /// - public void AddNodeLateAction(NodeLateAction la) - { - this.noteLateActions.Add(la); - } - - /// - /// Top level creation functions. Uses the definitions of RootAAS, RootConceptDescriptions, - /// RootDataSpecifications to synthesize information model - /// - public void CreateAddInstanceObjects(Aas.Environment env) - { - if (RootAAS == null) - return; - - // CDs (build 1st to be "remembered" as targets for "HasDictionaryEntry") - if (env.ConceptDescriptions != null && this.RootConceptDescriptions != null) - foreach (var cd in env.ConceptDescriptions) - { - this.AasTypes.ConceptDescription.CreateAddElements(this.RootConceptDescriptions, - AasUaBaseEntity.CreateMode.Instance, cd); - } - - // AAS - if (env.AssetAdministrationShells != null) - foreach (var aas in env.AssetAdministrationShells) - this.AasTypes.AAS.CreateAddInstanceObject(RootAAS, env, aas); - - // go through late actions - foreach (var la in this.noteLateActions) - { - // make a Reference ?? - var lax = la as NodeLateActionLinkToReference; - - // more simple case: AasReference between known entities - if (lax != null && lax.actionType == NodeLateActionLinkToReference.ActionType.SetAasReference - && lax.uanode != null - && this.package != null && this.package.AasEnv != null) - { - // 1st, take reference and turn it into Referable - var targetReferable = this.package.AasEnv.FindReferableByReference(lax.targetReference); - if (targetReferable == null) - continue; - - // 2nd, try to lookup the Referable and turn it into a uanode - var targetNodeRec = this.LookupNodeRecordFromReferable(targetReferable); - if (targetNodeRec == null || targetNodeRec.uanode == null) - continue; - - // now, we have everything to formulate a reference - lax.uanode.AddReference(this.AasTypes.HasAasReference.GetTypeNodeId(), false, - targetNodeRec.uanode.NodeId); - } - - // a bit more complicated: could include a "empty reference" to outside concept - if (lax != null && lax.actionType == NodeLateActionLinkToReference.ActionType.SetDictionaryEntry - && lax.uanode != null - && this.package != null && this.package.AasEnv != null) - { - // tracking - var foundAtAll = false; - - // 1st, take reference and turn it into Referable - var targetReferable = this.package.AasEnv.FindReferableByReference(lax.targetReference); - if (targetReferable != null) - { - // 2nd, try to lookup the Referable and turn it into a uanode - var targetNodeRec = this.LookupNodeRecordFromReferable(targetReferable); - if (targetNodeRec != null && targetNodeRec.uanode != null) - { - // simple case: have a target node, just make a link - lax.uanode.AddReference(this.AasTypes.HasDictionaryEntry.GetTypeNodeId(), false, - targetNodeRec.uanode.NodeId); - foundAtAll = true; - } - } - - // make "empty reference"?? - // by definition, this makes only sense if the targetReference has exactly 1 key, as we could - // only have one key in a dictionary entry - if (!foundAtAll && lax.targetReference.Keys.Count == 1) - { - // can turn the targetReference to a simple identification - var targetId = "" + lax.targetReference.Keys[0].Value; - - // we might have such an (empty) target already available as uanode - var nr = this.LookupNodeRecordFromId(targetId); - if (nr != null) - { - // just create the missing link - lax.uanode.AddReference(this.AasTypes.HasDictionaryEntry.GetTypeNodeId(), false, - nr.uanode?.NodeId); - } - else - { - // create NEW empty reference? - if (this.RootMissingDictionaryEntries != null) - { - // create missing object - var miss = this.CreateAddObject( - this.RootMissingDictionaryEntries, - AasUaBaseEntity.CreateMode.Instance, - targetId, - ReferenceTypeIds.HasComponent, - this.AasTypes.ConceptDescription.GetTypeObjectFor(targetId)?.NodeId); - - // add the reference - lax.uanode.AddReference(this.AasTypes.HasDictionaryEntry.GetTypeNodeId(), false, - miss?.NodeId); - - // put it into the NodeRecords, that it can be re-used?? no!! - this.AddNodeRecord(new AasEntityBuilder.NodeRecord(miss, targetId)); - } - else - { - // just create the missing link - // TODO (MIHO, 2020-08-06): check, which namespace shall be used - var missingTarget = new ExpandedNodeId("" + targetId, 99); - lax.uanode.AddReference(this.AasTypes.HasDictionaryEntry.GetTypeNodeId(), false, - missingTarget); - } - } - } - } - - } - } - - public ReferenceTypeState CreateAddReferenceType(string browseDisplayName, string inverseName, uint preferredNumId = 0, bool useZeroNS = false, NodeId sourceId = null, ExpandedNodeId extraSubtype = null) - { - // create node itself - var x = new ReferenceTypeState(); - x.BrowseName = browseDisplayName; - x.DisplayName = browseDisplayName; - x.InverseName = inverseName; - x.Symmetric = false; - x.IsAbstract = false; - x.NodeId = nodeMgr.NewType(nodeMgr.SystemContext, x, preferredNumId); - - // set Subtype reference - if (sourceId == null) - sourceId = new NodeId(32, 0); - - if (extraSubtype != null) - x.AddReference(ReferenceTypeIds.HasSubtype, isInverse: true, extraSubtype); - - // done - return x; - } - - public DataTypeState CreateAddDataType( - string browseDisplayName, NodeId superTypeId, uint preferredNumId = 0) - { - var x = new DataTypeState(); - x.BrowseName = "" + browseDisplayName; - x.DisplayName = "" + browseDisplayName; - x.Description = new LocalizedText("en", browseDisplayName); - x.SuperTypeId = superTypeId; - x.NodeId = nodeMgr.NewType(nodeMgr.SystemContext, x, preferredNumId); - - return x; - } - - /// - /// Helper to create an ObjectType-Node and it to the information model. - /// - /// Name displayed in the node tree - /// Base class or similar - /// Numerical id of the node in the default name space to be set fixed - /// Lookup a Description on AAS literal/ refSemantics - /// Modeling Rule, if not None - public BaseObjectTypeState CreateAddObjectType( - string browseDisplayName, - NodeId superTypeId, - uint preferredNumId = 0, - string descriptionKey = null, - AasUaNodeHelper.ModellingRule modellingRule = AasUaNodeHelper.ModellingRule.None) - { - var x = AasUaNodeHelper.CreateObjectType(browseDisplayName, superTypeId, descriptionKey: descriptionKey); - - x.NodeId = nodeMgr.NewType(nodeMgr.SystemContext, x, preferredNumId); - - return x; - } - - /// - /// Helper to create an Object-Node. Note: __NO__ NodeId is created by the default! Must be done by outer - /// functionality!! - /// - /// Parent node - /// Type or instance - /// Name displayed in the node tree - /// - /// Type of the Object - /// Modeling Rule, if not None - /// - /// The node - public BaseObjectState CreateAddObject( - NodeState parent, - AasUaBaseEntity.CreateMode mode, - string browseDisplayName, - NodeId referenceTypeFromParentId = null, - NodeId typeDefinitionId = null, - AasUaNodeHelper.ModellingRule modellingRule = AasUaNodeHelper.ModellingRule.None, - string extraName = null) - { - BaseObjectState baseObject = AasUaNodeHelper.CreateObject(parent, browseDisplayName, typeDefinitionId, modellingRule, extraName); - - baseObject.NodeId = nodeMgr.New(nodeMgr.SystemContext, mode, baseObject); - - parent?.AddChild(baseObject); - - if (referenceTypeFromParentId != null) - { - if (parent != null) - { - parent.AddReference(referenceTypeFromParentId, false, baseObject.NodeId); - - if (referenceTypeFromParentId == ReferenceTypeIds.HasComponent) - { - baseObject.AddReference(referenceTypeFromParentId, true, parent.NodeId); - } - - if (referenceTypeFromParentId == ReferenceTypeIds.HasProperty) - { - baseObject.AddReference(referenceTypeFromParentId, true, parent.NodeId); - } - } - } - - return baseObject; - } - - //// Properties - // - - /// - /// Helper to create an PropertyState-Node for a certain type and add it to the information model. - /// Note: __NO__ NodeId is created by the default! Must be done by outer functionality!! - /// - /// C# type of the proprty - /// Parent node - /// Type or instance - /// Name displayed in the node tree - /// Data type, such as String.. Given by DataTypeIds... - /// Value of the type T or Null - /// - /// Type definition; independent from DataType! - /// -1 or e.g. 1 for array - /// Apply default settings for a normal Property - /// Modeling Rule, if not None - /// NodeState - public PropertyState CreateAddPropertyState( - NodeState parent, AasUaBaseEntity.CreateMode mode, - string browseDisplayName, - NodeId dataTypeId, T value, - NodeId referenceTypeFromParentId = null, - NodeId typeDefinitionId = null, - int valueRank = -2, - bool defaultSettings = false, - AasUaNodeHelper.ModellingRule modellingRule = AasUaNodeHelper.ModellingRule.None) - { - // apply cumulative settings - if (defaultSettings) - { - referenceTypeFromParentId = ReferenceTypeIds.HasProperty; - typeDefinitionId = VariableTypeIds.PropertyType; - - if (valueRank == -2) - { - valueRank = -1; - } - } - - // make Property - var x = new PropertyState(parent); - x.BrowseName = "" + browseDisplayName; - x.DisplayName = "" + browseDisplayName; - x.Description = new LocalizedText("en", browseDisplayName); - x.DataType = dataTypeId; - if (valueRank > -2) - x.ValueRank = valueRank; - // ReSharper disable once RedundantCast - x.Value = (T)value; - AasUaNodeHelper.CheckSetModellingRule(modellingRule, x); - x.NodeId = nodeMgr.New(nodeMgr.SystemContext, mode, x); - - // add Node - if (parent != null) - parent.AddChild(x); - - // set relations - if (referenceTypeFromParentId != null) - { - if (parent != null) - { - parent.AddReference(referenceTypeFromParentId, false, x.NodeId); - - if (referenceTypeFromParentId == ReferenceTypeIds.HasComponent) - x.AddReference(referenceTypeFromParentId, true, parent.NodeId); - - if (referenceTypeFromParentId == ReferenceTypeIds.HasProperty) - x.AddReference(referenceTypeFromParentId, true, parent.NodeId); - } - } - - if (typeDefinitionId != null) - { - x.TypeDefinitionId = typeDefinitionId; - } - - x.AccessLevel = AccessLevels.CurrentReadOrWrite; - x.UserAccessLevel = AccessLevels.CurrentReadOrWrite; - - return x; - } - - public MethodState CreateAddMethodState( - NodeState parent, AasUaBaseEntity.CreateMode mode, - string browseDisplayName, - Argument[] inputArgs = null, Argument[] outputArgs = null, NodeId referenceTypeFromParentId = null, - NodeId methodDeclarationId = null, GenericMethodCalledEventHandler onCalled = null) - { - // method node - var m = new MethodState(parent); - m.BrowseName = "" + browseDisplayName; - m.DisplayName = "" + browseDisplayName; - m.Description = new LocalizedText("en", browseDisplayName); - m.NodeId = nodeMgr.New(nodeMgr.SystemContext, mode, m); - if (methodDeclarationId != null) - m.MethodDeclarationId = methodDeclarationId; - - m.Executable = true; - m.UserExecutable = true; - - if (parent != null) - parent.AddChild(m); - - if (referenceTypeFromParentId != null) - { - if (parent != null) - { - parent.AddReference(referenceTypeFromParentId, false, m.NodeId); - - if (referenceTypeFromParentId == ReferenceTypeIds.HasComponent) - m.AddReference(referenceTypeFromParentId, true, parent.NodeId); - - if (referenceTypeFromParentId == ReferenceTypeIds.HasProperty) - m.AddReference(referenceTypeFromParentId, true, parent.NodeId); - } - } - - // can have inputs, outputs - for (int i = 0; i < 2; i++) - { - // pretty argument list - var arguments = (i == 0) ? inputArgs : outputArgs; - if (arguments == null || arguments.Length < 1) - continue; - - // make a property for this - var prop = CreateAddPropertyState( - m, mode, - (i == 0) ? "InputArguments" : "OutputArguments", - DataTypeIds.Argument, - arguments, - ReferenceTypeIds.HasProperty, - typeDefinitionId: VariableTypeIds.PropertyType, - valueRank: 1); - - // explicitely add arguments ass well? - if (i == 0) - m.InputArguments = prop; - - if (i == 1) - m.OutputArguments = prop; - - } - - // event handler - if (onCalled != null) - m.OnCallMethod = onCalled; - - - return m; - } - - - //// Entities - // - - public class AasTypeEntities - { - public AasUaEntityPathType PathType; - public AasUaEntityMimeType MimeType; - - public AasUaEntityIdentification Identification; - public AasUaEntityAdministration Administration; - public AasUaEntityQualifier Qualifier; - public AasUaEntityAssetKind AssetKind; - public AasUaEntityModelingKind ModelingKind; - public AasUaEntityReferable Referable; - public AasUaEntityReferenceBase ReferenceBase; - public AasUaEntityReference Reference; - public AasUaEntitySemanticId SemanticId; - public AasUaEntitySubmodel Submodel; - public AasUaEntityProperty Property; - public AasUaEntityCollection Collection; - public AasUaEntitySmeList SmeList; - public AasUaEntitySubmodelElement SubmodelElement; - public AasUaEntitySubmodelWrapper SubmodelWrapper; - public AasUaEntityFile File; - public AasUaEntityFileType FileType; - public AasUaEntityBlob Blob; - public AasUaEntityReferenceElement ReferenceElement; - public AasUaEntityRelationshipElement RelationshipElement; - public AasUaEntityOperationVariable OperationVariable; - public AasUaEntityOperation Operation; - public AasUaEntityConceptDescription ConceptDescription; - public AasUaEntityAsset Asset; - public AasUaEntityAAS AAS; - - public AasUaEntityDataSpecification DataSpecification; - public AasUaEntityDataSpecificationIEC61360 DataSpecificationIEC61360; - - public AasUaInterfaceAASIdentifiableType IAASIdentifiableType; - public AasUaInterfaceAASReferableType IAASReferableType; - - public AasUaNamespaceZeroEntity BaseInterfaceType; - - public AasUaNamespaceZeroReference HasDictionaryEntry; - public AasUaReferenceHasAasReference HasAasReference; - public AasUaNamespaceZeroReference HasInterface; - public AasUaNamespaceZeroReference HasAddIn; - public AasUaNamespaceZeroEntity DictionaryEntryType; - public AasUaNamespaceZeroEntity UriDictionaryEntryType; - public AasUaNamespaceZeroEntity IrdiDictionaryEntryType; - public AasUaNamespaceZeroEntity DictionaryFolderType; - - public void BuildEntites(AasEntityBuilder builder) - { - // build up entities, which are in the UA specs, but not in this Stack - BaseInterfaceType = new AasUaNamespaceZeroEntity(builder, 17602); - HasDictionaryEntry = new AasUaNamespaceZeroReference(builder, 17597); - HasInterface = new AasUaNamespaceZeroReference(builder, 17603); - HasAddIn = new AasUaNamespaceZeroReference(builder, 17604); - DictionaryEntryType = new AasUaNamespaceZeroEntity(builder, 17589); - UriDictionaryEntryType = new AasUaNamespaceZeroEntity(builder, 17600); - IrdiDictionaryEntryType = new AasUaNamespaceZeroEntity(builder, 17598); - DictionaryFolderType = new AasUaNamespaceZeroEntity(builder, 17591); - - // AAS DataTypes - PathType = new AasUaEntityPathType(builder); - MimeType = new AasUaEntityMimeType(builder); - - // first entities - Referable = new AasUaEntityReferable(builder, 1004); - Identification = new AasUaEntityIdentification(builder, 1000); - Administration = new AasUaEntityAdministration(builder, 1001); - - // interfaces - IAASReferableType = new AasUaInterfaceAASReferableType( - builder, 2001); // dependencies: Referable - IAASIdentifiableType = new AasUaInterfaceAASIdentifiableType( - builder, 2000); // dependencies: IAASReferable - - // AAS References - ReferenceBase = new AasUaEntityReferenceBase(builder, 0); - Reference = new AasUaEntityReference(builder, 1005); - SemanticId = new AasUaEntitySemanticId(builder, 1006); // dependecies: Reference - HasAasReference = new AasUaReferenceHasAasReference(builder, 4000); // dependencies: Referable - - // Data Specifications - DataSpecification = new AasUaEntityDataSpecification(builder, 3000); - DataSpecificationIEC61360 = new AasUaEntityDataSpecificationIEC61360( - builder, 3001); // dependencies: Reference, Identification, Administration - - // rest - Qualifier = new AasUaEntityQualifier(builder, 1002); // dependencies: SemanticId, Reference - AssetKind = new AasUaEntityAssetKind(builder, 1025); - ModelingKind = new AasUaEntityModelingKind(builder, 1003); - SubmodelElement = new AasUaEntitySubmodelElement(builder, 1008); - SubmodelWrapper = new AasUaEntitySubmodelWrapper(builder, 1012); // dependencies: SubmodelElement - Submodel = new AasUaEntitySubmodel(builder, 1007); // dependencies: SubmodelWrapper - Property = new AasUaEntityProperty(builder, 1009); - Collection = new AasUaEntityCollection(builder, 1010); // needs 2 ids! - SmeList = new AasUaEntitySmeList(builder, 1028); // needs 2 ids! - FileType = new AasUaEntityFileType(builder, 1014); - File = new AasUaEntityFile(builder, 1013); // dependencies: FileType - Blob = new AasUaEntityBlob(builder, 1015); - ReferenceElement = new AasUaEntityReferenceElement(builder, 1016); - RelationshipElement = new AasUaEntityRelationshipElement(builder, 1017); - OperationVariable = new AasUaEntityOperationVariable(builder, 1018); - Operation = new AasUaEntityOperation(builder, 1019); - ConceptDescription = new AasUaEntityConceptDescription(builder, 1021); - Asset = new AasUaEntityAsset(builder, 1023); - AAS = new AasUaEntityAAS(builder, 1024); - } - } - - private AasTypeEntities aasTypes = null; - public AasTypeEntities AasTypes { get { return aasTypes; } } - - //// Annotations - // - - private Dictionary> nodeStateAnnotations = new Dictionary>(); - - public void AddNodeStateAnnotation(NodeState nodeState, object businessObject) - { - if (!nodeStateAnnotations.ContainsKey(nodeState)) - nodeStateAnnotations[nodeState] = new List(); - nodeStateAnnotations[nodeState].Add(businessObject); - } - - public void RemoveNodeStateAnnotation(NodeState nodeState, object businessObject) - { - if (!nodeStateAnnotations.ContainsKey(nodeState)) - return; - if (nodeStateAnnotations[nodeState].Contains(businessObject)) - nodeStateAnnotations[nodeState].Remove(businessObject); - } - - public T FindNoteStateAnnotation(NodeState nodeState) where T : class - { - if (nodeState == null) - return null; - if (!nodeStateAnnotations.ContainsKey(nodeState)) - return null; - foreach (var bo in nodeStateAnnotations[nodeState]) - if (bo is T) - return bo as T; - return null; - } - - } - -} diff --git a/src/AasxUaNetServer/AasxServer/AasEntityDescriptions.cs b/src/AasxUaNetServer/AasxServer/AasEntityDescriptions.cs deleted file mode 100644 index 29a5bfdc0..000000000 --- a/src/AasxUaNetServer/AasxServer/AasEntityDescriptions.cs +++ /dev/null @@ -1,131 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; - -namespace AasOpcUaServer -{ - // ReSharper disable once ClassNeverInstantiated.Global - public class AasEntityDescriptions - { - private static Dictionary keyToDescription = new Dictionary(); - - static AasEntityDescriptions() - { - AddDescription("AAS:Asset", - @"An Asset describes meta data of an asset that is represented by an AAS. - The asset may either represent an asset type or an asset instance. - The asset has a globally unique identifier plus – if needed – additional domain specific(proprietary) - identifiers. "); - - AddDescription("AAS:Identifier", - @"Used to uniquely identify an entity by using an identifier."); - - AddDescription("AAS:AdministrativeInformation", - @"Administrative metainformation for an element like version information."); - - AddDescription("AAS:AssetAdministrationShell", - @"An AssetAdministration Shell."); - - AddDescription("AAS:Submodel", - @"A Submodel defines a specific aspect of the asset represented by the AAS. - A submodel is used to structure the digital representation and technical functionality of an - Administration Shell into distinguishable parts. - Each submodel refers to a well-defined domain or subject matter. Submodels can become standardized - and thus become submodels types. Submodels can have different life-cycles. "); - - AddDescription("AAS:SubmodelElement", - @"A data element is a submodel element that is not further composed out of other submodel elements. - A data element is a submodel element that has a value. The type of value differs for different - subtypes of data elements."); - - AddDescription("AAS:Property", - @"A property is a data element that has a single value."); - - AddDescription("AAS:SubmodelElementCollection", - @"A submodel element collection is a set or list of submodel elements."); - - AddDescription("AAS:SubmodelElementCollection", - @"A submodel element collection is a set or list of submodel elements."); - - AddDescription("AAS:File", - @"A File is a data element that represents an address to a file. The value is an URI that can - represent an absolute or relative path."); - - AddDescription("AAS:Blob", - @"A BLOB is a data element that represents a file that is contained with its source code in the - value attribute."); - - AddDescription("AAS:ReferenceElement", - @"A reference element is a data element that defines a logical reference to another element within - the same or another AAS or a reference to an external object or entity."); - - AddDescription("AAS:RelationshipElement", - @"A relationship element is used to define a relationship between two referable elements."); - - AddDescription("AAS:OperationVariable", - @"An operation variable is a submodel element that is used as input or output variable of an - operation."); - - AddDescription("AAS:Operation", - @"An operation is a submodel element with input and output variables."); - - AddDescription("AAS:View", - @"A view is a collection of referable elements w.r.t. to a specific viewpoint of one or more - stakeholders."); - - AddDescription("AAS:ConceptDictionary", - @"A dictionary contains elements that can be reused. - The concept dictionary contains concept descriptions. - Typically a concept description dictionary of an AAS contains only concept descriptions of - elements used within submodels of the AAS"); - - AddDescription("AAS:DataSpecification", - @"A data specification template defines the additional attributes an element may or shall have."); - - AddDescription("AAS:DataSpecificationIEC61360", - @"Data Specification Template conformant to IEC61360."); - - AddDescription("AAS:ConceptDescription", - @"The semantics of a property or other elements that may have a semantic description is defined by a - concept description. The description of the concept should follow a standardized schema - (realized as data specification template)."); - - AddDescription("AAS:Identifiable", - @"An element that has a globally unique identifier. "); - - AddDescription("AAS:Referable", - @"An element that is referable but has no globally unique. The id of the element is unique within the - name space of the element."); - - } - - static void AddDescription(string key, string description) - { - if (key == null) - return; - keyToDescription[key.Trim().ToLower()] = description; - } - - public static string LookupDescription(string key) - { - if (key == null || !keyToDescription.ContainsKey(key.Trim().ToLower())) - return null; - var desc = keyToDescription[key.Trim().ToLower()]; - desc = Regex.Replace(desc, @"\s+", " "); - return desc; - } - - } -} diff --git a/src/AasxUaNetServer/AasxServer/AasNodeManager.cs b/src/AasxUaNetServer/AasxServer/AasNodeManager.cs deleted file mode 100644 index ecbae3a56..000000000 --- a/src/AasxUaNetServer/AasxServer/AasNodeManager.cs +++ /dev/null @@ -1,335 +0,0 @@ -/* ======================================================================== - * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved. - * - * OPC Foundation MIT License 1.00 - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * The complete license agreement can be found here: - * http://opcfoundation.org/License/MIT/1.00/ - * ======================================================================*/ - -using AdminShellNS; -using Opc.Ua; -using Opc.Ua.Server; -using Org.BouncyCastle.Asn1.X509; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; - -namespace AasOpcUaServer -{ - /// - /// A node manager the diagnostic information exposed by the server. - /// - public class AasNodeManager : CustomNodeManager2 - { - private AdminShellPackageEnv thePackageEnv = null; - private AasxUaServerOptions theServerOptions = null; - - #region Constructors - /// - /// Initializes the node manager. - /// - public AasNodeManager( - IServerInternal server, - ApplicationConfiguration configuration, - AdminShellPackageEnv env, - AasxUaServerOptions serverOptions = null) - : - base(server, configuration) - { - thePackageEnv = env; - theServerOptions = serverOptions; - - List namespaceUris = new List(); - namespaceUris.Add("http://opcfoundation.org/UA/i4aas/"); - namespaceUris.Add("http://admin-shell.io/samples/i4aas/instance/"); - // ReSharper disable once VirtualMemberCallInConstructor - NamespaceUris = namespaceUris; - - m_typeNamespaceIndex = Server.NamespaceUris.GetIndexOrAppend(namespaceUris[0]); - m_instanceNamespaceIndex = Server.NamespaceUris.GetIndexOrAppend(namespaceUris[1]); - - m_lastUsedId = 0; - } - #endregion - - #region INodeIdFactory Members - /// - /// Creates the NodeId for the specified node. - /// - /// The context. - /// Type or instance - /// The node. - /// The new NodeId. - public NodeId New(ISystemContext context, AasUaBaseEntity.CreateMode mode, NodeState node) - { - uint id = Utils.IncrementIdentifier(ref m_lastUsedId); - - if (mode == AasUaBaseEntity.CreateMode.Type) - { - return new NodeId(id, m_typeNamespaceIndex); - } - else - { - return new NodeId(id, m_instanceNamespaceIndex); - } - } - #endregion - - public NodeId NewType(ISystemContext context, NodeState node, uint preferredNumId) - { - uint id = preferredNumId; - - if (id == 0) - { - id = Utils.IncrementIdentifier(ref m_lastUsedTypeId); - } - - return new NodeId(id, m_typeNamespaceIndex); - } - - public void SaveNodestateCollectionAsNodeSet2(ISystemContext context, NodeStateCollection nsc, Stream stream, bool filterSingleNodeIds, NodeState rootItem = null) - { - Opc.Ua.Export.UANodeSet nodeSet = new Opc.Ua.Export.UANodeSet(); - nodeSet.LastModified = DateTime.UtcNow; - nodeSet.LastModifiedSpecified = true; - - Utils.Trace(Utils.TraceMasks.Operation, "Exporting {0} nodes ..", nsc.Count); - int i = 0; - foreach (var n in nsc) - { - nodeSet.Export(context, n); - if ((i++) % 500 == 0) - Utils.Trace(Utils.TraceMasks.Operation, " .. exported already {0} nodes ..", nodeSet.Items.Length); - } - - if (filterSingleNodeIds) - { - Utils.Trace(Utils.TraceMasks.Operation, "Filtering single node ids.."); - - var nodup = new List(); - - var visitedNodeIds = new Dictionary(); - - foreach (var it in nodeSet.Items) - { - if (visitedNodeIds.ContainsKey(it.NodeId)) - continue; - visitedNodeIds.Add(it.NodeId, 1); - - // try to remove double references - if (it.References != null) - { - var newrefs = new List(); - foreach (var oldref in it.References) - { - // trivial - if (oldref == null) - continue; - - // brute force check if already there - var found = false; - foreach (var nr in newrefs) - if (oldref.ReferenceType == nr.ReferenceType - && oldref.IsForward == nr.IsForward - && oldref.Value == nr.Value) - { - found = true; - break; - } - - // if not, add - if (!found) - newrefs.Add(oldref); - } - // only change when necessary (reduce the impact) - if (it.References.Length != newrefs.Count) - it.References = newrefs.ToArray(); - } - - nodup.Add(it); - } - - nodeSet.Items = nodup.ToArray(); - } - - // - // write - // - - Utils.Trace(Utils.TraceMasks.Operation, "Writing stream .."); - nodeSet.Write(stream); - } - - #region INodeManager Members - - private FolderState CreateAASFolder(IList objectsFolder) - { - string name = "AssetAdminShell"; - - FolderState folder = new FolderState(null) - { - SymbolicName = name, - ReferenceTypeId = ReferenceTypes.Organizes, - TypeDefinitionId = ObjectTypeIds.FolderType, - NodeId = new NodeId(name, m_instanceNamespaceIndex), - BrowseName = new QualifiedName(name, m_instanceNamespaceIndex), - DisplayName = new LocalizedText("en", name), - WriteMask = AttributeWriteMask.None, - UserWriteMask = AttributeWriteMask.None, - EventNotifier = EventNotifiers.None - }; - - objectsFolder?.Add(new NodeStateReference(ReferenceTypes.Organizes, false, folder.NodeId)); - - return folder; - } - - /// - /// Does any initialization required before the address space can be used. - /// - /// - /// The externalReferences is an out parameter that allows the node manager to link to nodes - /// in other node managers. For example, the 'Objects' node is managed by the CoreNodeManager and - /// should have a reference to the root folder node(s) exposed by this node manager. - /// - public override void CreateAddressSpace(IDictionary> externalReferences) - { - lock (Lock) - { - var builder = new AasEntityBuilder(this, thePackageEnv, null, theServerOptions); - - // get a reference to the objects folder - IList objectsFolder = null; - if (!externalReferences.TryGetValue(ObjectIds.ObjectsFolder, out objectsFolder)) - { - externalReferences[ObjectIds.ObjectsFolder] = objectsFolder = new List(); - } - - // create AAS folder under objects folder - FolderState root = CreateAASFolder(objectsFolder); - builder.RootAAS = root; - - // ceate dictionaries folder - BaseObjectState topOfDict = builder.CreateAddObject( - root, - AasUaBaseEntity.CreateMode.Instance, - "Dictionaries", - null, - builder.AasTypes.DictionaryFolderType.GetTypeNodeId()); - - // create a folder for Concept Descriptions - builder.RootConceptDescriptions = builder.CreateAddObject( - topOfDict, - AasUaBaseEntity.CreateMode.Instance, - "ConceptDescriptions", - ReferenceTypeIds.HasComponent, - builder.AasTypes.DictionaryFolderType.GetTypeNodeId()); - - // create dictionary entries - builder.RootMissingDictionaryEntries = builder.CreateAddObject( - topOfDict, - AasUaBaseEntity.CreateMode.Instance, - "DictionaryEntries", - ReferenceTypeIds.HasComponent, - builder.AasTypes.DictionaryFolderType.GetTypeNodeId()); - - builder.CreateAddInstanceObjects(thePackageEnv.AasEnv); - - AddPredefinedNode(SystemContext, root); - AddReverseReferences(externalReferences); - - // write nodeset2.xml file, if required - if (theServerOptions != null && theServerOptions.SpecialJob == AasxUaServerOptions.JobType.ExportNodesetXml) - { - try - { - // empty list - var nodesToExport = new NodeStateCollection(); - - // apply filter criteria - foreach (var y in this.PredefinedNodes) - { - var node = y.Value; - - if (theServerOptions.ExportFilterNamespaceIndex != null - && !theServerOptions.ExportFilterNamespaceIndex.Contains( - node.NodeId.NamespaceIndex)) - continue; - - nodesToExport.Add(node); - } - - // export - Utils.Trace(Utils.TraceMasks.Operation, - "Writing export file: " + theServerOptions.ExportFilename); - var stream = new StreamWriter(theServerOptions.ExportFilename); - - SaveNodestateCollectionAsNodeSet2(this.SystemContext, nodesToExport, stream.BaseStream, - filterSingleNodeIds: theServerOptions != null - && theServerOptions.FilterForSingleNodeIds, - builder.RootAAS); - - try - { - stream.Close(); - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); - } - - Utils.Trace(Utils.TraceMasks.Operation, - "Export file *** completely written! ***"); - - // stop afterwards - if (theServerOptions.FinalizeAction != null) - { - Utils.Trace(Utils.TraceMasks.Operation, - "Requesting to shut down application.."); - theServerOptions.FinalizeAction(); - } - - } - catch (Exception ex) - { - Utils.Trace(ex, "When exporting to {0}", "" + theServerOptions.ExportFilename); - } - } - - Debug.WriteLine("Done creating custom address space!"); - Utils.Trace(Utils.TraceMasks.Operation, "Done creating custom address space!"); - } - } - - #endregion - - #region Private Fields - private ushort m_instanceNamespaceIndex; - private ushort m_typeNamespaceIndex; - private long m_lastUsedId; - private long m_lastUsedTypeId; - #endregion - } -} diff --git a/src/AasxUaNetServer/AasxServer/AasUaEntities.cs b/src/AasxUaNetServer/AasxServer/AasUaEntities.cs deleted file mode 100644 index a7a8332ae..000000000 --- a/src/AasxUaNetServer/AasxServer/AasUaEntities.cs +++ /dev/null @@ -1,1951 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using AasCore.Aas3_0; -using AdminShellNS; -using Extensions; -using Opc.Ua; -using Aas = AasCore.Aas3_0; -using AasxIntegrationBase; - -// TODO (MIHO, 2020-08-29): The UA mapping needs to be overworked in order to comply the joint aligment with I4AAS -// TODO (MIHO, 2020-08-29): The UA mapping needs to be checked for the "new" HasDataSpecification strcuture of V2.0.1 - -namespace AasOpcUaServer -{ - public class AasUaBaseEntity - { - public enum CreateMode { Type, Instance }; - - /// - /// Reference back to the entity builder - /// - protected AasEntityBuilder entityBuilder = null; - - public AasUaBaseEntity(AasEntityBuilder entityBuilder) - { - this.entityBuilder = entityBuilder; - } - - /// - /// Typically the node of the entity in the AAS type object space - /// - protected NodeState typeObject = null; - - /// - /// If the entitiy does not have a direct type object, the object id instead (for pre-defined objects) - /// - protected NodeId typeObjectId = null; - - /// - /// Getter of the type object - /// - public NodeState GetTypeObject() - { - return typeObject; - } - - /// - /// Getter of the type object id, either directly or via the type object (if avilable) - /// - /// - public NodeId GetTypeNodeId() - { - if (typeObjectId != null) - return typeObjectId; - if (typeObject == null) - return null; - return typeObject.NodeId; - } - } - - public class AasUaEntityPathType : AasUaBaseEntity - { - public AasUaEntityPathType(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type elements - this.typeObject = this.entityBuilder.CreateAddDataType("AASPathType", DataTypeIds.String); - } - } - - public class AasUaEntityMimeType : AasUaBaseEntity - { - public AasUaEntityMimeType(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type elements - this.typeObject = this.entityBuilder.CreateAddDataType("AASMimeType", DataTypeIds.String); - } - } - - public class AasUaEntityIdentification : AasUaBaseEntity - { - public AasUaEntityIdentification(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - this.typeObject = this.entityBuilder.CreateAddObjectType("AASIdentifierType", - ObjectTypeIds.BaseObjectType, preferredTypeNumId, descriptionKey: "AAS:Identifier"); - // add some elements - - if (true == entityBuilder.theServerOptions?.SimpleDataTypes) - { - this.entityBuilder.CreateAddDataType("IdType", DataTypeIds.String); - this.entityBuilder.CreateAddDataType("Id", DataTypeIds.String); - } - else - { - // this is the original code, which gets not imported by SiOME - this.entityBuilder.CreateAddPropertyState(this.typeObject, CreateMode.Type, "IdType", - DataTypeIds.String, null, defaultSettings: true, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - this.entityBuilder.CreateAddPropertyState(this.typeObject, CreateMode.Type, "Id", - DataTypeIds.String, null, defaultSettings: true, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - } - } - - public NodeState CreateAddElements(NodeState parent, CreateMode mode, - string id = null, - AasUaNodeHelper.ModellingRule modellingRule = AasUaNodeHelper.ModellingRule.None) - { - if (parent == null) - return null; - - var o = this.entityBuilder.CreateAddObject(parent, mode, "Identification", - ReferenceTypeIds.HasComponent, GetTypeObject().NodeId, modellingRule: modellingRule); - - if (mode == CreateMode.Instance) - { - if (id != null) - { - this.entityBuilder.CreateAddPropertyState(o, mode, "Id", - DataTypeIds.String, "" + "" + id, defaultSettings: true); - } - } - - return o; - } - } - - public class AasUaEntityAdministration : AasUaBaseEntity - { - public AasUaEntityAdministration(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - this.typeObject = this.entityBuilder.CreateAddObjectType("AASAdministrativeInformationType", - ObjectTypeIds.BaseObjectType, preferredTypeNumId, descriptionKey: "AAS:AdministrativeInformation"); - // add some elements - this.entityBuilder.CreateAddPropertyState(this.typeObject, CreateMode.Type, "Version", - DataTypeIds.String, null, defaultSettings: true, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - this.entityBuilder.CreateAddPropertyState(this.typeObject, CreateMode.Type, "Revision", - DataTypeIds.String, null, defaultSettings: true, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - } - - public NodeState CreateAddElements(NodeState parent, CreateMode mode, - Aas.IAdministrativeInformation administration = null, - AasUaNodeHelper.ModellingRule modellingRule = AasUaNodeHelper.ModellingRule.None) - { - if (parent == null) - return null; - // Create whole object only if required - if (mode == CreateMode.Instance && administration == null) - return null; - - var o = this.entityBuilder.CreateAddObject(parent, mode, "Administration", - ReferenceTypeIds.HasComponent, GetTypeObject().NodeId, modellingRule: modellingRule); - - if (mode == CreateMode.Instance) - { - if (administration == null) - return null; - this.entityBuilder.CreateAddPropertyState(o, mode, "Version", - DataTypeIds.String, "" + "" + administration.Version, defaultSettings: true); - this.entityBuilder.CreateAddPropertyState(o, mode, "Revision", - DataTypeIds.String, "" + "" + administration.Revision, defaultSettings: true); - } - - return o; - } - } - - public class AasUaEntityQualifier : AasUaBaseEntity - { - public AasUaEntityQualifier(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - this.typeObject = this.entityBuilder.CreateAddObjectType("AASQualifierType", - ObjectTypeIds.BaseObjectType, preferredTypeNumId, "AAS:Qualifier"); - - // add some elements - this.entityBuilder.AasTypes.SemanticId.CreateAddInstanceObject(this.typeObject, - CreateMode.Type, null, "SemanticId", modellingRule: AasUaNodeHelper.ModellingRule.Optional); - this.entityBuilder.CreateAddPropertyState(this.typeObject, CreateMode.Type, "Type", - DataTypeIds.String, null, defaultSettings: true, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - this.entityBuilder.CreateAddPropertyState(this.typeObject, CreateMode.Type, "Value", - DataTypeIds.String, null, defaultSettings: true, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - this.entityBuilder.AasTypes.Reference.CreateAddElements(this.typeObject, CreateMode.Type, - null, "ValueId", AasUaNodeHelper.ModellingRule.Optional); - } - - public NodeState CreateAddElements(NodeState parent, CreateMode mode, Aas.IQualifier qualifier = null, - AasUaNodeHelper.ModellingRule modellingRule = AasUaNodeHelper.ModellingRule.None) - { - if (parent == null) - return null; - // Create whole object only if required - if (mode == CreateMode.Instance && qualifier == null) - return null; - - if (mode == CreateMode.Type) - { - // plain - var o = this.entityBuilder.CreateAddObject(parent, mode, "Qualifier", ReferenceTypeIds.HasComponent, - GetTypeObject().NodeId, modellingRule: modellingRule); - return o; - } - else - { - // need data - if (qualifier == null) - return null; - - // do a little extra? - string extraName = null; - if (qualifier.Type != null && qualifier.Type.Length > 0) - { - extraName = "Qualifier:" + qualifier.Type; - if (qualifier.Value != null && qualifier.Value.Length > 0) - extraName += "=" + qualifier.Value; - } - - var o = this.entityBuilder.CreateAddObject(parent, mode, "Qualifier", - ReferenceTypeIds.HasComponent, GetTypeObject().NodeId, modellingRule: modellingRule, - extraName: extraName); - - this.entityBuilder.AasTypes.SemanticId.CreateAddInstanceObject(o, - CreateMode.Instance, qualifier.SemanticId, "SemanticId"); - this.entityBuilder.CreateAddPropertyState(o, mode, "Type", - DataTypeIds.String, "" + qualifier.Type, defaultSettings: true); - this.entityBuilder.CreateAddPropertyState(o, mode, "Value", - DataTypeIds.String, "" + qualifier.Value, defaultSettings: true); - this.entityBuilder.AasTypes.Reference.CreateAddElements(o, - CreateMode.Instance, qualifier.ValueId, "ValueId"); - - return o; - } - - } - } - - public class AasUaEntityAssetKind : AasUaBaseEntity - { - public AasUaEntityAssetKind(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - // no special type here (is a string) - } - - public NodeState CreateAddElements(NodeState parent, CreateMode mode, Aas.AssetKind? kind = null, - AasUaNodeHelper.ModellingRule modellingRule = AasUaNodeHelper.ModellingRule.None) - { - if (mode == CreateMode.Instance && kind == null) - return null; - - var o = this.entityBuilder.CreateAddPropertyState(parent, mode, "Kind", - DataTypeIds.String, - (mode == CreateMode.Type) - ? null - : "" + (kind != null ? Stringification.ToString(kind.Value) : ""), - defaultSettings: true, - modellingRule: modellingRule); - - return o; - } - } - - public class AasUaEntityModelingKind : AasUaBaseEntity - { - public AasUaEntityModelingKind(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - // no special type here (is a string) - } - - public NodeState CreateAddElements(NodeState parent, CreateMode mode, Aas.ModellingKind? kind = null, - AasUaNodeHelper.ModellingRule modellingRule = AasUaNodeHelper.ModellingRule.None) - { - if (mode == CreateMode.Instance && kind == null) - return null; - - var o = this.entityBuilder.CreateAddPropertyState(parent, mode, "Kind", - DataTypeIds.String, - (mode == CreateMode.Type) - ? null - : "" + (kind != null ? Stringification.ToString(kind) : ""), - defaultSettings: true, - modellingRule: modellingRule); - - return o; - } - } - - public class AasUaEntityReferable : AasUaBaseEntity - { - public AasUaEntityReferable(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // NO type object required - // see IAASReferable interface - } - - /// - /// This adds all Referable attributes to the parent and re-defines the descriptons - /// - public NodeState CreateAddElements(NodeState parent, CreateMode mode, Aas.IReferable refdata = null) - { - if (parent == null) - return null; - if (mode == CreateMode.Instance && refdata == null) - return null; - - if (mode == CreateMode.Type || refdata?.Category != null) - this.entityBuilder.CreateAddPropertyState(parent, mode, "Category", - DataTypeIds.String, (mode == CreateMode.Type) ? null : "" + refdata?.Category, - defaultSettings: true, modellingRule: AasUaNodeHelper.ModellingRule.Optional); - - // No idShort as typically in the DisplayName of the node - - if (mode == CreateMode.Instance) - { - // now, re-set the description on the parent - // ISSUE: only ONE language supported! - parent.Description = AasUaUtils.GetBestUaDescriptionFromAasDescription(refdata?.Description); - } - - return null; - } - } - - public class AasUaEntityReferenceBase : AasUaBaseEntity - { - public AasUaEntityReferenceBase(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // nothing, only used to share code - } - - /// - /// Sets the "Keys" value information of an AAS Reference. This is especially important for referencing - /// outwards of the AAS (environment). - /// - public void CreateAddKeyElements(NodeState parent, CreateMode mode, Aas.IReference rf = null) - { - if (parent == null) - return; - - // MIHO: open62541 does not to process Values as string[], therefore change it temporarily - - if (this.entityBuilder != null && this.entityBuilder.theServerOptions != null - && this.entityBuilder.theServerOptions.ReferenceKeysAsSingleString) - { - // fix for open62541 - - var typeo = this.entityBuilder.CreateAddPropertyState(parent, mode, "Type", - DataTypeIds.String, null, defaultSettings: true); - - var keyo = this.entityBuilder.CreateAddPropertyState(parent, mode, "Keys", - DataTypeIds.String, null, defaultSettings: true); - - if (mode == CreateMode.Instance && keyo != null) - { - typeo.Value = Stringification.ToString(rf.Type); - keyo.Value = AasUaUtils.ToOpcUaReference(rf); - } - } - else - { - // default behaviour - var keyo = this.entityBuilder?.CreateAddPropertyState(parent, mode, "Keys", - DataTypeIds.Structure, null, defaultSettings: true); - - if (mode == CreateMode.Instance && keyo != null) - { - keyo.Value = AasUaUtils.ToOpcUaReferenceList(rf)?.ToArray(); - } - } - } - - /// - /// Sets the UA relation of an AAS Reference. This is especially important for reference within an AAS node - /// structure, to be - /// in the style of OPC UA - /// - public void CreateAddReferenceElements(NodeState parent, CreateMode mode, List keys = null) - { - if (parent == null) - return; - - if (mode == CreateMode.Type) - { - // makes no sense - } - else - { - // would make sense, but is replaced by the code in "CreateAddInstanceObjects" directly. - } - } - } - - public class AasUaEntityReference : AasUaEntityReferenceBase - { - public AasUaEntityReference(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - this.typeObject = this.entityBuilder.CreateAddObjectType("AASReferenceType", - ObjectTypeIds.BaseObjectType, preferredTypeNumId); - // with some elements - this.CreateAddKeyElements(this.typeObject, CreateMode.Type); - this.CreateAddReferenceElements(this.typeObject, CreateMode.Type); - } - - public NodeState CreateAddElements(NodeState parent, CreateMode mode, - Aas.IReference reference, string browseDisplayName = null, - AasUaNodeHelper.ModellingRule modellingRule = AasUaNodeHelper.ModellingRule.None) - { - if (parent == null) - return null; - - if (mode == CreateMode.Type) - { - var o = this.entityBuilder.CreateAddObject(parent, mode, browseDisplayName ?? "Reference", - ReferenceTypeIds.HasComponent, GetTypeObject().NodeId, modellingRule: modellingRule); - return o; - } - else - { - if (reference == null) - return null; - - var o = this.entityBuilder.CreateAddObject(parent, mode, browseDisplayName ?? "Reference", - ReferenceTypeIds.HasComponent, GetTypeObject().NodeId); - - // explicit strings? - this.CreateAddKeyElements(o, mode, reference); - - // find a matching concept description or other referable? - // as we do not have all other nodes realized, store a late action - this.entityBuilder.AddNodeLateAction( - new AasEntityBuilder.NodeLateActionLinkToReference( - o, - reference, - AasEntityBuilder.NodeLateActionLinkToReference.ActionType.SetAasReference - )); - - // OK - return o; - } - } - } - - public class AasUaEntitySemanticId : AasUaEntityReferenceBase - { - public AasUaEntitySemanticId(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // re-use AASReferenceType for this - this.typeObject = this.entityBuilder.AasTypes.Reference.GetTypeObject(); - // with some elements - this.CreateAddReferenceElements(this.typeObject, CreateMode.Type); - } - - public NodeState CreateAddInstanceObject(NodeState parent, CreateMode mode, - Aas.IReference semid = null, string browseDisplayName = null, - AasUaNodeHelper.ModellingRule modellingRule = AasUaNodeHelper.ModellingRule.None) - { - if (parent == null) - return null; - - if (mode == CreateMode.Type) - { - var o = this.entityBuilder.CreateAddObject(parent, mode, browseDisplayName ?? "SemanticId", - ReferenceTypeIds.HasComponent, GetTypeObject().NodeId, modellingRule: modellingRule); - return o; - } - else - { - if (semid == null) - return null; - - var o = this.entityBuilder.CreateAddObject(parent, mode, browseDisplayName ?? "SemanticId", - ReferenceTypeIds.HasComponent, GetTypeObject().NodeId); - - // explicit strings? - this.CreateAddKeyElements(o, mode, semid); - - // find a matching concept description or other referable? - // as we do not have all other nodes realized, store a late action - this.entityBuilder.AddNodeLateAction( - new AasEntityBuilder.NodeLateActionLinkToReference( - parent, - semid.Copy(), - AasEntityBuilder.NodeLateActionLinkToReference.ActionType.SetDictionaryEntry - )); - - // OK - return o; - } - } - } - - public class AasUaEntityAsset : AasUaBaseEntity - { - public AasUaEntityAsset(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - this.typeObject = this.entityBuilder.CreateAddObjectType("AASAssetType", - ObjectTypeIds.BaseObjectType, preferredTypeNumId, descriptionKey: "AAS:Asset"); - this.entityBuilder.AasTypes.HasInterface.CreateAddInstanceReference(this.typeObject, false, - this.entityBuilder.AasTypes.IAASIdentifiableType.GetTypeNodeId()); - - // add necessary type information - // Referable - this.entityBuilder.AasTypes.Referable.CreateAddElements(this.typeObject, CreateMode.Type); - // Identifiable - this.entityBuilder.AasTypes.Identification.CreateAddElements(this.typeObject, CreateMode.Type, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - this.entityBuilder.AasTypes.Administration.CreateAddElements(this.typeObject, CreateMode.Type, - modellingRule: AasUaNodeHelper.ModellingRule.Optional); - // HasKind - this.entityBuilder.AasTypes.AssetKind.CreateAddElements(this.typeObject, CreateMode.Type, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - // HasDataSpecification - this.entityBuilder.AasTypes.Reference.CreateAddElements(this.typeObject, CreateMode.Type, - null, "DataSpecification", modellingRule: AasUaNodeHelper.ModellingRule.OptionalPlaceholder); - // own attributes - this.entityBuilder.AasTypes.Reference.CreateAddElements(this.typeObject, CreateMode.Type, - null, "AssetIdentificationModel", modellingRule: AasUaNodeHelper.ModellingRule.Optional); - } - - public NodeState CreateAddElements(NodeState parent, CreateMode mode, Aas.IAssetInformation asset = null, - AasUaNodeHelper.ModellingRule modellingRule = AasUaNodeHelper.ModellingRule.None) - { - if (parent == null) - return null; - // Create whole object only if required - if (mode == CreateMode.Instance && asset == null) - return null; - - // containing element - var o = this.entityBuilder.CreateAddObject(parent, mode, "Asset", ReferenceTypeIds.HasComponent, - GetTypeObject().NodeId, modellingRule: modellingRule); - - if (mode == CreateMode.Instance) - { - // access - if (asset == null) - return null; - - // register node record - this.entityBuilder.AddNodeRecord(new AasEntityBuilder.NodeRecord(o, asset.GlobalAssetId)); - // dead-csharp off - // Referable - // this.entityBuilder.AasTypes.Referable.CreateAddElements(o, CreateMode.Instance, asset); - // Identifiable (V3.0: not anymore) - // this.entityBuilder.AasTypes.Identification.CreateAddElements( - // o, CreateMode.Instance, asset.identification); - // this.entityBuilder.AasTypes.Administration.CreateAddElements( - // o, CreateMode.Instance, asset.administration); - - // HasKind - this.entityBuilder.AasTypes.AssetKind.CreateAddElements(o, CreateMode.Instance, asset.AssetKind); - - // own attributes - //this.entityBuilder.AasTypes.Reference.CreateAddElements( - // o, CreateMode.Instance, asset.assetIdentificationModelRef, "AssetIdentificationModel"); - // dead-csharp on - } - - return o; - } - } - - public class AasUaEntityAAS : AasUaBaseEntity - { - public AasUaEntityAAS(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - this.typeObject = this.entityBuilder.CreateAddObjectType("AASAssetAdministrationShellType", - ObjectTypeIds.BaseObjectType, preferredTypeNumId, descriptionKey: "AAS:AssetAdministrationShell"); - - // interface - this.entityBuilder.AasTypes.HasInterface.CreateAddInstanceReference(this.typeObject, false, - this.entityBuilder.AasTypes.IAASIdentifiableType.GetTypeNodeId()); - - // add necessary type information - // Referable - this.entityBuilder.AasTypes.Referable.CreateAddElements(this.typeObject, CreateMode.Type); - // Identifiable - this.entityBuilder.AasTypes.Identification.CreateAddElements(this.typeObject, CreateMode.Type, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - this.entityBuilder.AasTypes.Administration.CreateAddElements(this.typeObject, CreateMode.Type, - modellingRule: AasUaNodeHelper.ModellingRule.Optional); - // HasDataSpecification - this.entityBuilder.AasTypes.Reference.CreateAddElements(this.typeObject, CreateMode.Type, null, - "DataSpecification", modellingRule: AasUaNodeHelper.ModellingRule.OptionalPlaceholder); - - // own attributes - this.entityBuilder.AasTypes.Reference.CreateAddElements(this.typeObject, CreateMode.Type, null, - "DerivedFrom", modellingRule: AasUaNodeHelper.ModellingRule.Optional); - // assets - this.entityBuilder.AasTypes.Asset.CreateAddElements(this.typeObject, CreateMode.Type, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - // associated submodels - this.entityBuilder.AasTypes.Submodel.CreateAddElements(this.typeObject, CreateMode.Type, - modellingRule: AasUaNodeHelper.ModellingRule.OptionalPlaceholder); - } - - public NodeState CreateAddInstanceObject(NodeState parent, - Aas.Environment env, Aas.IAssetAdministrationShell aas) - { - // access - if (env == null || aas == null) - return null; - - // containing element - string extraName = null; - string browseName = "AssetAdministrationShell"; - if (aas.IdShort != null && aas.IdShort.Trim().Length > 0) - { - extraName = "AssetAdministrationShell:" + aas.IdShort; - browseName = aas.IdShort; - } - var o = this.entityBuilder.CreateAddObject(parent, CreateMode.Instance, - browseName, ReferenceTypeIds.HasComponent, - GetTypeObject().NodeId, extraName: extraName); - - // register node record - this.entityBuilder.AddNodeRecord(new AasEntityBuilder.NodeRecord(o, aas)); - - // Referable - this.entityBuilder.AasTypes.Referable.CreateAddElements(o, CreateMode.Instance, aas); - // Identifiable - this.entityBuilder.AasTypes.Identification.CreateAddElements( - o, CreateMode.Instance, aas.Id); - this.entityBuilder.AasTypes.Administration.CreateAddElements( - o, CreateMode.Instance, aas.Administration); - // HasDataSpecification - if (aas.EmbeddedDataSpecifications != null) - foreach (var ds in aas.EmbeddedDataSpecifications) - this.entityBuilder.AasTypes.Reference.CreateAddElements( - o, CreateMode.Instance, ds?.DataSpecification, "DataSpecification"); - // own attributes - this.entityBuilder.AasTypes.Reference.CreateAddElements( - o, CreateMode.Instance, aas.DerivedFrom, "DerivedFrom"); - - // associated asset - // TODO (??, 0000-00-00): AssetInformation - // dead-csharp off - //if (aas.assetRef != null) - //{ - // var asset = env.FindAsset(aas.assetRef); - // if (asset != null) - // this.entityBuilder.AasTypes.Asset.CreateAddElements( - // o, CreateMode.Instance, asset); - //} - // dead-csharp on - // associated submodels - if (aas.Submodels != null) - foreach (var smr in aas.Submodels) - { - var sm = env.FindSubmodel(smr); - if (sm != null) - this.entityBuilder.AasTypes.Submodel.CreateAddElements( - o, CreateMode.Instance, sm); - } - - // results - return o; - } - } - - public class AasUaEntitySubmodel : AasUaBaseEntity - { - public AasUaEntitySubmodel(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - this.typeObject = this.entityBuilder.CreateAddObjectType("AASSubmodelType", - ObjectTypeIds.BaseObjectType, preferredTypeNumId, descriptionKey: "AAS:Submodel"); - this.entityBuilder.AasTypes.HasInterface.CreateAddInstanceReference(this.typeObject, false, - this.entityBuilder.AasTypes.IAASIdentifiableType.GetTypeNodeId()); - - // add some elements - // Referable - this.entityBuilder.AasTypes.Referable.CreateAddElements(this.typeObject, CreateMode.Type); - // Identifiable - this.entityBuilder.AasTypes.Identification.CreateAddElements(this.typeObject, CreateMode.Type, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - this.entityBuilder.AasTypes.Administration.CreateAddElements(this.typeObject, CreateMode.Type, - modellingRule: AasUaNodeHelper.ModellingRule.Optional); - // HasSemantics - this.entityBuilder.AasTypes.SemanticId.CreateAddInstanceObject(this.typeObject, CreateMode.Type, null, - "SemanticId", modellingRule: AasUaNodeHelper.ModellingRule.Optional); - // HasKind - this.entityBuilder.AasTypes.ModelingKind.CreateAddElements(this.typeObject, CreateMode.Type, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - // HasDataSpecification - this.entityBuilder.AasTypes.Reference.CreateAddElements(this.typeObject, CreateMode.Type, null, - "DataSpecification", modellingRule: AasUaNodeHelper.ModellingRule.OptionalPlaceholder); - // Qualifiable - this.entityBuilder.AasTypes.Qualifier.CreateAddElements(this.typeObject, CreateMode.Type, - modellingRule: AasUaNodeHelper.ModellingRule.OptionalPlaceholder); - // SubmodelElements - this.entityBuilder.AasTypes.SubmodelWrapper.CreateAddElements(this.typeObject, CreateMode.Type, - modellingRule: AasUaNodeHelper.ModellingRule.OptionalPlaceholder); - } - - public NodeState CreateAddElements(NodeState parent, CreateMode mode, Aas.ISubmodel sm = null, - AasUaNodeHelper.ModellingRule modellingRule = AasUaNodeHelper.ModellingRule.None) - { - if (parent == null) - return null; - - if (mode == CreateMode.Type) - { - // create only containing element with generic name - var o = this.entityBuilder.CreateAddObject(parent, mode, "Submodel", ReferenceTypeIds.HasComponent, - this.GetTypeNodeId(), modellingRule: modellingRule); - return o; - } - else - { - // access - if (sm == null) - return null; - - // containing element - var o = this.entityBuilder.CreateAddObject(parent, mode, - "" + sm.IdShort, ReferenceTypeIds.HasComponent, - GetTypeObject().NodeId, extraName: "Submodel:" + sm.IdShort); - - // register node record - this.entityBuilder.AddNodeRecord(new AasEntityBuilder.NodeRecord(o, sm)); - - // Referable - this.entityBuilder.AasTypes.Referable.CreateAddElements( - o, CreateMode.Instance, sm); - // Identifiable - this.entityBuilder.AasTypes.Identification.CreateAddElements( - o, CreateMode.Instance, sm.Id); - this.entityBuilder.AasTypes.Administration.CreateAddElements( - o, CreateMode.Instance, sm.Administration); - // HasSemantics - this.entityBuilder.AasTypes.SemanticId.CreateAddInstanceObject( - o, CreateMode.Instance, sm.SemanticId, "SemanticId"); - // HasKind - this.entityBuilder.AasTypes.ModelingKind.CreateAddElements( - o, CreateMode.Instance, sm.Kind); - // HasDataSpecification - if (sm.EmbeddedDataSpecifications != null) - foreach (var ds in sm.EmbeddedDataSpecifications) - this.entityBuilder.AasTypes.Reference.CreateAddElements( - o, CreateMode.Instance, ds?.DataSpecification, "DataSpecification"); - // Qualifiable - if (sm.Qualifiers != null) - foreach (var q in sm.Qualifiers) - this.entityBuilder.AasTypes.Qualifier.CreateAddElements( - o, CreateMode.Instance, q); - - // SubmodelElements - if (sm.SubmodelElements != null) - foreach (var smw in sm.SubmodelElements) - this.entityBuilder.AasTypes.SubmodelWrapper.CreateAddElements( - o, CreateMode.Instance, smw); - - // result - return o; - } - } - } - - /// - /// This class is for the representation if SME in UA namespace - /// - public class AasUaEntitySubmodelElement : AasUaBaseEntity - { - public AasUaEntitySubmodelElement(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - this.typeObject = this.entityBuilder.CreateAddObjectType("AASSubmodelElementType", - ObjectTypeIds.BaseObjectType, preferredTypeNumId, descriptionKey: "AAS:SubmodelElement"); - this.entityBuilder.AasTypes.HasInterface.CreateAddInstanceReference(this.typeObject, false, - this.entityBuilder.AasTypes.IAASReferableType.GetTypeNodeId()); - - // add some elements to the type - // Note: in this special case, the instance elements are populated by AasUaEntitySubmodelElementBase, - // while the elements - // for the type are populated here - - // Referable - this.entityBuilder.AasTypes.Referable.CreateAddElements(this.typeObject, CreateMode.Type); - // HasSemantics - this.entityBuilder.AasTypes.SemanticId.CreateAddInstanceObject(this.typeObject, CreateMode.Type, null, - "SemanticId", modellingRule: AasUaNodeHelper.ModellingRule.Optional); - // HasKind - this.entityBuilder.AasTypes.ModelingKind.CreateAddElements(this.typeObject, CreateMode.Type, null, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - // HasDataSpecification - this.entityBuilder.AasTypes.Reference.CreateAddElements(this.typeObject, CreateMode.Type, null, - "DataSpecification", modellingRule: AasUaNodeHelper.ModellingRule.OptionalPlaceholder); - // Qualifiable - this.entityBuilder.AasTypes.Qualifier.CreateAddElements(this.typeObject, CreateMode.Type, - modellingRule: AasUaNodeHelper.ModellingRule.OptionalPlaceholder); - } - } - - /// - /// This class is the base class of derived properties - /// - public class AasUaEntitySubmodelElementBase : AasUaBaseEntity - { - public AasUaEntitySubmodelElementBase(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // do NOT create type object, as this is done by sub-class - } - - public NodeState PopulateInstanceObject(NodeState o, Aas.ISubmodelElement sme) - { - // access - if (o == null || sme == null) - return null; - - // take this as perfect opportunity to register node record - this.entityBuilder.AddNodeRecord(new AasEntityBuilder.NodeRecord(o, sme)); - - // Referable - this.entityBuilder.AasTypes.Referable.CreateAddElements( - o, CreateMode.Instance, sme); - // HasSemantics - this.entityBuilder.AasTypes.SemanticId.CreateAddInstanceObject( - o, CreateMode.Instance, sme.SemanticId, "SemanticId"); - // HasDataSpecification - if (sme.EmbeddedDataSpecifications != null) - foreach (var ds in sme.EmbeddedDataSpecifications) - this.entityBuilder.AasTypes.Reference.CreateAddElements( - o, CreateMode.Instance, ds?.DataSpecification, "DataSpecification"); - // Qualifiable - if (sme.Qualifiers != null) - foreach (var q in sme.Qualifiers) - this.entityBuilder.AasTypes.Qualifier.CreateAddElements( - o, CreateMode.Instance, q); - - // result - return o; - } - } - - /// - /// This class will automatically instantiate the correct SubmodelElement entity. - /// - public class AasUaEntitySubmodelWrapper : AasUaBaseEntity - { - public AasUaEntitySubmodelWrapper(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // do NOT create type object, as this is done by sub-class - } - - public NodeState CreateAddElements(NodeState parent, CreateMode mode, - Aas.ISubmodelElement smw = null, - AasUaNodeHelper.ModellingRule modellingRule = AasUaNodeHelper.ModellingRule.None) - { - // access - if (parent == null) - return null; - - if (mode == CreateMode.Type) - { - // create only containing element (base type) with generic name - var o = this.entityBuilder.CreateAddObject(parent, mode, - "SubmodelElement", ReferenceTypeIds.HasComponent, - this.entityBuilder.AasTypes.SubmodelElement.GetTypeNodeId(), modellingRule: modellingRule); - return o; - } - else - { - if (smw == null) - return null; - - if (smw is Aas.ISubmodelElementCollection coll) - return this.entityBuilder.AasTypes.Collection.CreateAddInstanceObject(parent, coll); - else if (smw is Aas.ISubmodelElementList list) - return this.entityBuilder.AasTypes.SmeList.CreateAddInstanceObject(parent, list); - else if (smw is Aas.IProperty) - return this.entityBuilder.AasTypes.Property.CreateAddInstanceObject( - parent, smw as Aas.IProperty); - else if (smw is Aas.IFile) - return this.entityBuilder.AasTypes.File.CreateAddInstanceObject( - parent, smw as Aas.IFile); - else if (smw is Aas.IBlob) - return this.entityBuilder.AasTypes.Blob.CreateAddInstanceObject( - parent, smw as Aas.IBlob); - else if (smw is Aas.IReferenceElement) - return this.entityBuilder.AasTypes.ReferenceElement.CreateAddInstanceObject( - parent, smw as Aas.IReferenceElement); - else if (smw is Aas.IRelationshipElement) - return this.entityBuilder.AasTypes.RelationshipElement.CreateAddInstanceObject( - parent, smw as Aas.IRelationshipElement); - else if (smw is Aas.IOperation) - return this.entityBuilder.AasTypes.Operation.CreateAddInstanceObject( - parent, smw as Aas.IOperation); - - // nope - return null; - } - } - } - - public class AasUaEntityProperty : AasUaEntitySubmodelElementBase - { - public AasUaEntityProperty(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - this.typeObject = this.entityBuilder.CreateAddObjectType( - "AASPropertyType", entityBuilder.AasTypes.SubmodelElement.GetTypeNodeId(), preferredTypeNumId, - descriptionKey: "AAS:Property"); - - // elements not in the base type - this.entityBuilder.AasTypes.Reference.CreateAddElements(this.typeObject, CreateMode.Instance, null, - "ValueId", modellingRule: AasUaNodeHelper.ModellingRule.Optional); - this.entityBuilder.CreateAddPropertyState(this.typeObject, CreateMode.Type, "ValueType", - DataTypeIds.String, null, defaultSettings: true, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - this.entityBuilder.CreateAddPropertyState(this.typeObject, CreateMode.Type, "Value", - DataTypeIds.BaseDataType, null, defaultSettings: true, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - } - - public NodeState CreateAddInstanceObject(NodeState parent, Aas.IProperty prop) - { - // access - if (prop == null) - return null; - - // for all - var mode = CreateMode.Instance; - - // containing element - var o = this.entityBuilder.CreateAddObject(parent, mode, "" + prop.IdShort, ReferenceTypeIds.HasComponent, - GetTypeObject().NodeId); - - // populate common attributes - base.PopulateInstanceObject(o, prop); - - // TODO (MIHO, 2020-08-06): not sure if to add these - this.entityBuilder.AasTypes.Reference.CreateAddElements(o, CreateMode.Instance, prop.ValueId, "ValueId"); - this.entityBuilder.CreateAddPropertyState(o, mode, "ValueType", - DataTypeIds.String, "" + prop.ValueType, defaultSettings: true); - - // aim is to support many types natively - - if (prop.ValueType == DataTypeDefXsd.Boolean) - { - var x = (prop.Value ?? "").ToLower().Trim(); - this.entityBuilder.CreateAddPropertyState(o, mode, "Value", - DataTypeIds.Boolean, x == "true", defaultSettings: true); - } - else if (prop.ValueType == DataTypeDefXsd.DateTime - || prop.ValueType == DataTypeDefXsd.Date - || prop.ValueType == DataTypeDefXsd.Time) - { - if (DateTime.TryParse(prop.Value, CultureInfo.InvariantCulture, - DateTimeStyles.AssumeUniversal, out var dt)) - this.entityBuilder.CreateAddPropertyState(o, mode, "Value", - DataTypeIds.DateTime, dt.ToFileTimeUtc(), defaultSettings: true); - } - else if (prop.ValueType == DataTypeDefXsd.Decimal - || prop.ValueType == DataTypeDefXsd.Integer - || prop.ValueType == DataTypeDefXsd.Long - || prop.ValueType == DataTypeDefXsd.NegativeInteger) - { - if (Int64.TryParse(prop.Value, out var v)) - this.entityBuilder.CreateAddPropertyState(o, mode, "Value", - DataTypeIds.Int64, v, defaultSettings: true); - } - else if (prop.ValueType == DataTypeDefXsd.Int) - { - if (Int32.TryParse(prop.Value, out var v)) - this.entityBuilder.CreateAddPropertyState(o, mode, "Value", - DataTypeIds.Int32, v, defaultSettings: true); - } - else if (prop.ValueType == DataTypeDefXsd.Short) - { - if (Int16.TryParse(prop.Value, out var v)) - this.entityBuilder.CreateAddPropertyState(o, mode, "Value", - DataTypeIds.Int16, v, defaultSettings: true); - } - else if (prop.ValueType == DataTypeDefXsd.Byte) - { - if (SByte.TryParse(prop.Value, out var v)) - this.entityBuilder.CreateAddPropertyState(o, mode, "Value", - DataTypeIds.Byte, v, defaultSettings: true); - } - else if (prop.ValueType == DataTypeDefXsd.NonNegativeInteger - || prop.ValueType == DataTypeDefXsd.PositiveInteger - || prop.ValueType == DataTypeDefXsd.UnsignedLong) - { - if (UInt64.TryParse(prop.Value, out var v)) - this.entityBuilder.CreateAddPropertyState(o, mode, "Value", - DataTypeIds.UInt64, v, defaultSettings: true); - } - else if (prop.ValueType == DataTypeDefXsd.UnsignedInt) - { - if (UInt32.TryParse(prop.Value, out var v)) - this.entityBuilder.CreateAddPropertyState(o, mode, "Value", - DataTypeIds.UInt32, v, defaultSettings: true); - } - else if (prop.ValueType == DataTypeDefXsd.UnsignedShort) - { - if (UInt16.TryParse(prop.Value, out var v)) - this.entityBuilder.CreateAddPropertyState(o, mode, "Value", - DataTypeIds.UInt16, v, defaultSettings: true); - } - else if (prop.ValueType == DataTypeDefXsd.UnsignedByte) - { - if (Byte.TryParse(prop.Value, out var v)) - this.entityBuilder.CreateAddPropertyState(o, mode, "Value", - DataTypeIds.Byte, v, defaultSettings: true); - } - else if (prop.ValueType == DataTypeDefXsd.Double) - { - if (double.TryParse(prop.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out var v)) - this.entityBuilder.CreateAddPropertyState(o, mode, "Value", - DataTypeIds.Double, v, defaultSettings: true); - } - else if (prop.ValueType == DataTypeDefXsd.Float) - { - if (float.TryParse(prop.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out var v)) - this.entityBuilder.CreateAddPropertyState(o, mode, "Value", - DataTypeIds.Float, v, defaultSettings: true); - } - else - { - // leave in string - this.entityBuilder.CreateAddPropertyState(o, mode, "Value", - DataTypeIds.String, prop.Value, defaultSettings: true); - } - - // result - return o; - } - } - - public class AasUaEntityCollection : AasUaEntitySubmodelElementBase - { - public NodeState typeObjectOrdered = null; - - public AasUaEntityCollection(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - // TODO (MIHO, 2020-08-06): use the collection element of UA? - this.typeObject = this.entityBuilder.CreateAddObjectType("AASSubmodelElementCollectionType", - entityBuilder.AasTypes.SubmodelElement.GetTypeNodeId(), preferredTypeNumId, - descriptionKey: "AAS:SubmodelElementCollection"); - this.typeObjectOrdered = this.entityBuilder.CreateAddObjectType("AASSubmodelElementOrderedCollectionType", - this.GetTypeNodeId(), preferredTypeNumId + 1, - descriptionKey: "AAS:SubmodelElementCollection"); - - // some elements - // ReSharper disable once RedundantExplicitArrayCreation - foreach (var o in new NodeState[] { this.typeObject /* , this.typeObjectOrdered */ }) - { - this.entityBuilder.CreateAddPropertyState(o, CreateMode.Type, "AllowDuplicates", - DataTypeIds.Boolean, false, defaultSettings: true, - modellingRule: AasUaNodeHelper.ModellingRule.Optional); - } - } - - public NodeState CreateAddInstanceObject(NodeState parent, Aas.ISubmodelElementCollection coll) - { - // access - if (coll == null) - return null; - // dead-csharp off - // containing element - var to = GetTypeObject().NodeId; - //if (coll.ordered && this.typeObjectOrdered != null) - // to = this.typeObjectOrdered.NodeId; - var o = this.entityBuilder.CreateAddObject(parent, CreateMode.Instance, - "" + coll.IdShort, ReferenceTypeIds.HasComponent, to); - - // populate common attributes - base.PopulateInstanceObject(o, coll); - - // own attributes - //this.entityBuilder.CreateAddPropertyState(o, CreateMode.Instance, "AllowDuplicates", - // DataTypeIds.Boolean, coll.AllowDuplicates, defaultSettings: true); - // dead-csharp on - // values - if (coll.Value != null) - foreach (var smw in coll.Value) - this.entityBuilder.AasTypes.SubmodelWrapper.CreateAddElements( - o, CreateMode.Instance, smw); - - // result - return o; - } - } - - public class AasUaEntitySmeList : AasUaEntitySubmodelElementBase - { - public NodeState typeObjectOrdered = null; - - public AasUaEntitySmeList(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - this.typeObject = this.entityBuilder.CreateAddObjectType("AASSubmodelElementListType", - entityBuilder.AasTypes.SubmodelElement.GetTypeNodeId(), preferredTypeNumId, - descriptionKey: "AAS:SubmodelElementList"); - this.typeObjectOrdered = this.entityBuilder.CreateAddObjectType("AASSubmodelElementOrderedListType", - this.GetTypeNodeId(), preferredTypeNumId + 1, - descriptionKey: "AAS:SubmodelElementList"); - - // some elements - // ReSharper disable once RedundantExplicitArrayCreation - foreach (var o in new NodeState[] { this.typeObject /* , this.typeObjectOrdered */ }) - { - this.entityBuilder.CreateAddPropertyState(o, CreateMode.Type, "AllowDuplicates", - DataTypeIds.Boolean, false, defaultSettings: true, - modellingRule: AasUaNodeHelper.ModellingRule.Optional); - } - } - - public NodeState CreateAddInstanceObject(NodeState parent, Aas.ISubmodelElementList list) - { - // access - if (list == null) - return null; - - // containing element - var to = GetTypeObject().NodeId; - if (list.OrderRelevant.HasValue && list.OrderRelevant.Value && this.typeObjectOrdered != null) - to = this.typeObjectOrdered.NodeId; - var o = this.entityBuilder.CreateAddObject(parent, CreateMode.Instance, - "" + list.IdShort, ReferenceTypeIds.HasComponent, to); - - // populate common attributes - base.PopulateInstanceObject(o, list); - - // own attributes - // dead-csharp off - //this.entityBuilder.CreateAddPropertyState(o, CreateMode.Instance, "AllowDuplicates", - // DataTypeIds.Boolean, coll.AllowDuplicates, defaultSettings: true); - // dead-csharp on - // values - if (list.Value != null) - foreach (var smw in list.Value) - this.entityBuilder.AasTypes.SubmodelWrapper.CreateAddElements( - o, CreateMode.Instance, smw); - - // result - return o; - } - } - - public class AasUaEntityFile : AasUaEntitySubmodelElementBase - { - public AasUaEntityFile(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - this.typeObject = this.entityBuilder.CreateAddObjectType("AASFileType", - entityBuilder.AasTypes.SubmodelElement.GetTypeNodeId(), - preferredTypeNumId, descriptionKey: "AAS:File"); - - // some elements - this.entityBuilder.CreateAddPropertyState( - this.typeObject, CreateMode.Type, "MimeType", - (this.entityBuilder.theServerOptions?.SimpleDataTypes == true) - ? DataTypeIds.String - : this.entityBuilder.AasTypes.MimeType.GetTypeNodeId(), - null, defaultSettings: true, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - - this.entityBuilder.CreateAddPropertyState( - this.typeObject, CreateMode.Type, "Value", - (true == this.entityBuilder?.theServerOptions?.SimpleDataTypes) - ? DataTypeIds.String - : this.entityBuilder.AasTypes.PathType.GetTypeNodeId(), - null, defaultSettings: true, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - - this.entityBuilder.AasTypes.FileType.CreateAddElements(this.typeObject, CreateMode.Type); - } - - public NodeState CreateAddInstanceObject(NodeState parent, Aas.IFile file) - { - // access - if (file == null) - return null; - - // containing element - var o = this.entityBuilder.CreateAddObject(parent, CreateMode.Instance, "" + file.IdShort, - ReferenceTypeIds.HasComponent, GetTypeObject().NodeId); - - // populate common attributes - base.PopulateInstanceObject(o, file); - - // own attributes - this.entityBuilder.CreateAddPropertyState( - o, CreateMode.Instance, "MimeType", - (this.entityBuilder.theServerOptions?.SimpleDataTypes == true) - ? DataTypeIds.String - : this.entityBuilder.AasTypes.MimeType.GetTypeNodeId(), - file.ContentType, defaultSettings: true); - this.entityBuilder.CreateAddPropertyState( - o, CreateMode.Instance, "Value", - (true == this.entityBuilder?.theServerOptions?.SimpleDataTypes) - ? DataTypeIds.String - : this.entityBuilder.AasTypes.PathType.GetTypeNodeId(), - file.Value, defaultSettings: true); - - // wonderful working - if (this.entityBuilder.AasTypes.FileType.CheckSuitablity(this.entityBuilder.package, file)) - this.entityBuilder.AasTypes.FileType.CreateAddElements( - o, CreateMode.Instance, this.entityBuilder.package, file); - - // result - return o; - } - } - - public class AasUaEntityBlob : AasUaEntitySubmodelElementBase - { - public AasUaEntityBlob(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - this.typeObject = this.entityBuilder.CreateAddObjectType("AASBlobType", - entityBuilder.AasTypes.SubmodelElement.GetTypeNodeId(), preferredTypeNumId, - descriptionKey: "AAS:Blob"); - - // some elements - this.entityBuilder.CreateAddPropertyState( - this.typeObject, CreateMode.Type, "MimeType", - DataTypeIds.String, null, defaultSettings: true, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - this.entityBuilder.CreateAddPropertyState(this.typeObject, CreateMode.Type, "Value", - DataTypeIds.String, null, defaultSettings: true, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - } - - public NodeState CreateAddInstanceObject(NodeState parent, Aas.IBlob blob) - { - // access - if (blob == null) - return null; - - // containing element - var o = this.entityBuilder.CreateAddObject(parent, CreateMode.Instance, "" + blob.IdShort, - ReferenceTypeIds.HasComponent, GetTypeObject().NodeId); - - // populate common attributes - base.PopulateInstanceObject(o, blob); - - // own attributes - this.entityBuilder.CreateAddPropertyState( - o, CreateMode.Instance, "ContentType", - DataTypeIds.String, blob.ContentType, defaultSettings: true); - this.entityBuilder.CreateAddPropertyState(o, CreateMode.Instance, "Value", - DataTypeIds.String, System.Text.Encoding.UTF8.GetString(blob.Value), defaultSettings: true); - - // result - return o; - } - } - - public class AasUaEntityReferenceElement : AasUaEntitySubmodelElementBase - { - public AasUaEntityReferenceElement(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - this.typeObject = this.entityBuilder.CreateAddObjectType("AASReferenceElementType", - entityBuilder.AasTypes.SubmodelElement.GetTypeNodeId(), preferredTypeNumId, - descriptionKey: "AAS:ReferenceElement"); - - // some elements - this.entityBuilder.AasTypes.Reference.CreateAddElements(this.typeObject, CreateMode.Type, null, "Value", - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - } - - public NodeState CreateAddInstanceObject(NodeState parent, Aas.IReferenceElement refElem) - { - // access - if (refElem == null) - return null; - - // containing element - var o = this.entityBuilder.CreateAddObject(parent, CreateMode.Instance, "" + refElem.IdShort, - ReferenceTypeIds.HasComponent, GetTypeObject().NodeId); - - // populate common attributes - base.PopulateInstanceObject(o, refElem); - - // own attributes - this.entityBuilder.AasTypes.Reference.CreateAddElements(o, CreateMode.Instance, refElem.Value, "Value"); - - // result - return o; - } - } - - public class AasUaEntityRelationshipElement : AasUaEntitySubmodelElementBase - { - public AasUaEntityRelationshipElement(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - this.typeObject = this.entityBuilder.CreateAddObjectType("AASRelationshipElementType", - entityBuilder.AasTypes.SubmodelElement.GetTypeNodeId(), preferredTypeNumId, - descriptionKey: "AAS:RelationshipElement"); - - // some elements - this.entityBuilder.AasTypes.Reference.CreateAddElements(this.typeObject, CreateMode.Type, null, - "First", modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - this.entityBuilder.AasTypes.Reference.CreateAddElements(this.typeObject, CreateMode.Type, null, - "Second", modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - } - - public NodeState CreateAddInstanceObject(NodeState parent, Aas.IRelationshipElement relElem) - { - // access - if (relElem == null) - return null; - - // containing element - var o = this.entityBuilder.CreateAddObject(parent, CreateMode.Instance, "" + relElem.IdShort, - ReferenceTypeIds.HasComponent, GetTypeObject().NodeId); - - // populate common attributes - base.PopulateInstanceObject(o, relElem); - - // own attributes - this.entityBuilder.AasTypes.Reference.CreateAddElements(o, CreateMode.Instance, relElem.First, "First"); - this.entityBuilder.AasTypes.Reference.CreateAddElements(o, CreateMode.Instance, relElem.Second, "Second"); - - // result - return o; - } - } - - public class AasUaEntityOperationVariable : AasUaEntitySubmodelElementBase - { - public AasUaEntityOperationVariable(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - this.typeObject = this.entityBuilder.CreateAddObjectType("OperationVariableType", - entityBuilder.AasTypes.SubmodelElement.GetTypeNodeId(), preferredTypeNumId, - descriptionKey: "AAS:OperationVariable"); - } - - public NodeState CreateAddInstanceObject(NodeState parent, Aas.IOperationVariable opvar) - { - // access - if (opvar == null || opvar.Value == null) - return null; - - // containing element - var o = this.entityBuilder.CreateAddObject(parent, CreateMode.Instance, - "" + opvar.Value.IdShort, - ReferenceTypeIds.HasComponent, GetTypeObject().NodeId); - - // populate common attributes - base.PopulateInstanceObject(o, opvar.Value); - - // own attributes - this.entityBuilder.AasTypes.SubmodelWrapper.CreateAddElements(o, CreateMode.Instance, opvar.Value); - - // result - return o; - } - } - - public class AasUaEntityOperation : AasUaEntitySubmodelElementBase - { - public AasUaEntityOperation(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - this.typeObject = this.entityBuilder.CreateAddObjectType("AASOperationType", - entityBuilder.AasTypes.SubmodelElement.GetTypeNodeId(), preferredTypeNumId, - descriptionKey: "AAS:Operation"); - - // indicate the Operation - this.entityBuilder.CreateAddMethodState(this.typeObject, CreateMode.Type, "Operation", - inputArgs: null, - outputArgs: null, - referenceTypeFromParentId: ReferenceTypeIds.HasComponent); - - // some elements - for (int i = 0; i < 2; i++) - { - var o2 = this.entityBuilder.CreateAddObject(this.typeObject, CreateMode.Type, (i == 0) ? "in" : "out", - ReferenceTypeIds.HasComponent, - this.entityBuilder.AasTypes.OperationVariable.GetTypeObject().NodeId); - this.entityBuilder.AasTypes.OperationVariable.CreateAddInstanceObject(o2, null); - } - } - - public NodeState CreateAddInstanceObject(NodeState parent, Aas.IOperation op) - { - // access - if (op == null) - return null; - - // containing element - var o = this.entityBuilder.CreateAddObject(parent, CreateMode.Instance, - "" + op.IdShort, - ReferenceTypeIds.HasComponent, GetTypeObject().NodeId); - - // populate common attributes - base.PopulateInstanceObject(o, op); - - // own AAS attributes (in/out op vars) - for (int i = 0; i < 2; i++) - { - var opvarList = op.GetVars((OperationVariableDirection)i); - if (opvarList != null && opvarList.Count > 0) - { - var o2 = this.entityBuilder.CreateAddObject(o, - CreateMode.Instance, - (i == 0) ? "OperationInputVariables" : "OperationOutputVariables", - ReferenceTypeIds.HasComponent, GetTypeObject().NodeId); - foreach (var opvar in opvarList) - if (opvar != null && opvar.Value != null) - this.entityBuilder.AasTypes.SubmodelWrapper.CreateAddElements( - o2, CreateMode.Instance, opvar.Value); - } - } - - // create a method? - if (true) - { - // ReSharper disable once RedundantExplicitArrayCreation - var args = new List[] { new List(), new List() }; - for (int i = 0; i < 2; i++) - { - var opList = op.GetVars((OperationVariableDirection)i); - if (opList != null) - foreach (var opvar in opList) - { - // TODO (MIHO, 2020-08-06): decide to from where the name comes - var name = "noname"; - - // TODO (MIHO, 2020-08-06): description: get "en" version which is appropriate? - LocalizedText desc = new LocalizedText(""); - - // TODO (MIHO, 2020-08-06): parse UA data type out .. OK? - NodeId dataType = null; - if (opvar.Value != null) - { - // better name .. but not best (see below) - if (opvar.Value.IdShort != null - && opvar.Value.IdShort.Trim() != "") - name = "" + opvar.Value.IdShort; - - // TODO (MIHO, 2020-08-06): description: get "en" version is appropriate? - desc = AasUaUtils.GetBestUaDescriptionFromAasDescription( - opvar.Value.Description); - - // currenty, only accept properties as in/out arguments. - // Only these have an XSD value type!! - var prop = opvar.Value as Aas.IProperty; - if (prop != null) - { - // TODO (MIHO, 2020-08-06): this any better? - if (prop.IdShort != null && prop.IdShort.Trim() != "") - name = "" + prop.IdShort; - - // TODO (MIHO, 2020-08-06): description: get "en" version is appropriate? - if (desc.Text == null || desc.Text == "") - desc = AasUaUtils.GetBestUaDescriptionFromAasDescription( - opvar.Value.Description); - - // try convert type - if (!AasUaUtils.AasValueTypeToUaDataType( - prop.ValueType, out var dummy, out dataType)) - dataType = null; - } - } - if (dataType == null) - continue; - - var a = new Argument(name, dataType, -1, desc.Text ?? ""); - args[i].Add(a); - } - } - - var unused = this.entityBuilder.CreateAddMethodState(o, CreateMode.Instance, "Operation", - inputArgs: args[0].ToArray(), - outputArgs: args[1].ToArray(), - referenceTypeFromParentId: ReferenceTypeIds.HasComponent); - } - - // result - return o; - } - } - - public class AasUaEntityDataSpecification : AasUaBaseEntity - { - public AasUaEntityDataSpecification(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - this.typeObject = this.entityBuilder.CreateAddObjectType("AASDataSpecificationType", - ObjectTypeIds.BaseObjectType, preferredTypeNumId, descriptionKey: "AAS:DataSpecification"); - this.entityBuilder.AasTypes.HasInterface.CreateAddInstanceReference(this.typeObject, false, - this.entityBuilder.AasTypes.IAASIdentifiableType.GetTypeNodeId()); - } - - } - - public class AasUaEntityDataSpecificationIEC61360 : AasUaBaseEntity - { - public AasUaEntityDataSpecificationIEC61360(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - this.typeObject = this.entityBuilder.CreateAddObjectType("AASDataSpecificationIEC61360Type", - this.entityBuilder.AasTypes.DataSpecification.GetTypeNodeId(), preferredTypeNumId, - descriptionKey: "AAS:DataSpecificationIEC61360"); - - // very special rule here for the Identifiable - this.entityBuilder.AasTypes.HasInterface.CreateAddInstanceReference(this.typeObject, false, - this.entityBuilder.AasTypes.IAASIdentifiableType.GetTypeNodeId()); - this.entityBuilder.AasTypes.Referable.CreateAddElements(this.typeObject, CreateMode.Type); - this.entityBuilder.AasTypes.Identification.CreateAddElements(this.typeObject, CreateMode.Instance, - "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360", - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - this.entityBuilder.AasTypes.Administration.CreateAddElements(this.typeObject, CreateMode.Instance, - new Aas.AdministrativeInformation(version: "1", revision: "0"), - modellingRule: AasUaNodeHelper.ModellingRule.Optional); - - // add some more elements - this.entityBuilder.CreateAddPropertyState(this.typeObject, CreateMode.Type, - "PreferredName", - DataTypeIds.LocalizedText, - value: null, defaultSettings: true, valueRank: 1, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - - this.entityBuilder.CreateAddPropertyState(this.typeObject, CreateMode.Type, - "ShortName", - DataTypeIds.String, value: null, defaultSettings: true, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - - this.entityBuilder.CreateAddPropertyState(this.typeObject, CreateMode.Type, - "Unit", - DataTypeIds.String, value: null, defaultSettings: true, - modellingRule: AasUaNodeHelper.ModellingRule.Optional); - - this.entityBuilder.AasTypes.Reference.CreateAddElements(this.typeObject, CreateMode.Type, null, - "UnitId", - modellingRule: AasUaNodeHelper.ModellingRule.Optional); - - this.entityBuilder.CreateAddPropertyState(this.typeObject, CreateMode.Type, - "SourceOfDefinition", - DataTypeIds.LocalizedText, - value: null, defaultSettings: true, valueRank: 1, - modellingRule: AasUaNodeHelper.ModellingRule.OptionalPlaceholder); - - this.entityBuilder.CreateAddPropertyState(this.typeObject, CreateMode.Type, - "Symbol", DataTypeIds.String, - value: null, defaultSettings: true, modellingRule: AasUaNodeHelper.ModellingRule.Optional); - - this.entityBuilder.CreateAddPropertyState(this.typeObject, CreateMode.Type, - "DataType", DataTypeIds.String, - value: null, defaultSettings: true, modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - - this.entityBuilder.CreateAddPropertyState(this.typeObject, CreateMode.Type, - "Definition", - DataTypeIds.LocalizedText, value: null, defaultSettings: true, valueRank: 1, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - - this.entityBuilder.CreateAddPropertyState(this.typeObject, CreateMode.Type, - "ValueFormat", - DataTypeIds.String, value: null, defaultSettings: true, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - } - - public NodeState CreateAddElements(NodeState parent, CreateMode mode, - Aas.IDataSpecificationIec61360 ds = null, - AasUaNodeHelper.ModellingRule modellingRule = AasUaNodeHelper.ModellingRule.None) - { - if (parent == null) - return null; - - // for the sake of clarity, we're directly splitting cases - if (mode == CreateMode.Type) - { - // containing element (only) - var o = this.entityBuilder.CreateAddObject(parent, mode, "DataSpecificationIec61360", - this.entityBuilder.AasTypes.HasAddIn.GetTypeNodeId(), GetTypeObject().NodeId, - modellingRule: modellingRule); - return o; - } - else - { - // access - if (ds == null) - return null; - - // we can only provide minimal unique naming - var name = "DataSpecificationIEC61360"; - if (ds.PreferredName != null && this.entityBuilder.RootDataSpecifications != null) - name += "_" + ds.PreferredName; - - // containing element (depending on root folder) - NodeState o = null; - if (this.entityBuilder.RootDataSpecifications != null) - { - // under common folder - o = this.entityBuilder.CreateAddObject(this.entityBuilder.RootDataSpecifications, mode, name, - ReferenceTypeIds.Organizes, GetTypeObject().NodeId); - // link to this object - parent.AddReference(this.entityBuilder.AasTypes.HasAddIn.GetTypeNodeId(), false, o.NodeId); - } - else - { - // under parent - o = this.entityBuilder.CreateAddObject(parent, mode, name, - this.entityBuilder.AasTypes.HasAddIn.GetTypeNodeId(), GetTypeObject().NodeId); - } - - // add some elements - if (ds.PreferredName != null && ds.PreferredName.Count > 0) - this.entityBuilder.CreateAddPropertyState(o, mode, "PreferredName", - DataTypeIds.LocalizedText, - value: AasUaUtils.GetUaLocalizedTexts(ds.PreferredName), - defaultSettings: true, valueRank: 1); - - if (ds.ShortName != null && ds.ShortName.Count > 0) - this.entityBuilder.CreateAddPropertyState(o, mode, "ShortName", - DataTypeIds.LocalizedText, - value: AasUaUtils.GetUaLocalizedTexts(ds.ShortName), - defaultSettings: true, valueRank: 1); - - if (ds.Unit != null) - this.entityBuilder.CreateAddPropertyState(o, mode, "Unit", - DataTypeIds.String, value: ds.Unit, defaultSettings: true); - - if (ds.UnitId != null) - this.entityBuilder.AasTypes.Reference.CreateAddElements(o, mode, - ds.UnitId, "UnitId"); - - if (ds.SourceOfDefinition != null) - this.entityBuilder.CreateAddPropertyState(o, mode, "SourceOfDefinition", - DataTypeIds.String, value: ds.SourceOfDefinition, defaultSettings: true); - - if (ds.Symbol != null) - this.entityBuilder.CreateAddPropertyState(o, mode, "Symbol", - DataTypeIds.String, value: ds.Symbol, defaultSettings: true); - - if (ds.DataType != null) - this.entityBuilder.CreateAddPropertyState(o, mode, "DataType", - DataTypeIds.String, value: Stringification.ToString(ds.DataType.Value), - defaultSettings: true); - - if (ds.Definition != null && ds.Definition.Count > 0) - this.entityBuilder.CreateAddPropertyState(o, mode, "Definition", - DataTypeIds.LocalizedText, value: AasUaUtils.GetUaLocalizedTexts(ds.Definition), - defaultSettings: true, valueRank: 1); - - if (ds.ValueFormat != null) - this.entityBuilder.CreateAddPropertyState(o, mode, "ValueFormat", - DataTypeIds.String, value: ds.ValueFormat, defaultSettings: true); - - // return - return o; - } - } - } - - public class AasUaEntityConceptDescription : AasUaBaseEntity - { - public NodeState typeObjectIrdi; - public NodeState typeObjectUri; - public NodeState typeObjectCustom; - - - public AasUaEntityConceptDescription(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - // TODO (MIHO, 2020-08-06): check, if to make super classes for UriDictionaryEntryType? - this.typeObjectIrdi = this.entityBuilder.CreateAddObjectType("AASIrdiConceptDescriptionType", - this.entityBuilder.AasTypes.IrdiDictionaryEntryType.GetTypeNodeId(), 0, - descriptionKey: "AAS:ConceptDescription"); - this.entityBuilder.AasTypes.HasInterface.CreateAddInstanceReference(this.typeObjectIrdi, false, - this.entityBuilder.AasTypes.IAASIdentifiableType.GetTypeNodeId()); - - this.typeObjectUri = this.entityBuilder.CreateAddObjectType("AASUriConceptDescriptionType", - this.entityBuilder.AasTypes.UriDictionaryEntryType.GetTypeNodeId(), 0, - descriptionKey: "AAS:ConceptDescription"); - this.entityBuilder.AasTypes.HasInterface.CreateAddInstanceReference(this.typeObjectUri, false, - this.entityBuilder.AasTypes.IAASIdentifiableType.GetTypeNodeId()); - - this.typeObjectCustom = this.entityBuilder.CreateAddObjectType("AASCustomConceptDescriptionType", - this.entityBuilder.AasTypes.DictionaryEntryType.GetTypeNodeId(), 0, - descriptionKey: "AAS:ConceptDescription"); - this.entityBuilder.AasTypes.HasInterface.CreateAddInstanceReference(this.typeObjectCustom, false, - this.entityBuilder.AasTypes.IAASIdentifiableType.GetTypeNodeId()); - - // for each of them, add some elements - // ReSharper disable once RedundantExplicitArrayCreation - foreach (var o in new NodeState[] { this.typeObjectIrdi, this.typeObjectUri, this.typeObjectCustom }) - { - // Referable - this.entityBuilder.AasTypes.Referable.CreateAddElements(o, CreateMode.Type); - // Identifiable - this.entityBuilder.AasTypes.Identification.CreateAddElements(o, CreateMode.Type, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - this.entityBuilder.AasTypes.Administration.CreateAddElements(o, CreateMode.Type, - modellingRule: AasUaNodeHelper.ModellingRule.Optional); - // IsCaseOf - this.entityBuilder.AasTypes.Reference.CreateAddElements(o, CreateMode.Type, null, "IsCaseOf", - modellingRule: AasUaNodeHelper.ModellingRule.Optional); - // HasDataSpecification - this.entityBuilder.AasTypes.Reference.CreateAddElements(o, CreateMode.Type, null, "DataSpecification", - modellingRule: AasUaNodeHelper.ModellingRule.OptionalPlaceholder); - - // data specification is a child - this.entityBuilder.AasTypes.DataSpecificationIEC61360.CreateAddElements(o, CreateMode.Type, - modellingRule: AasUaNodeHelper.ModellingRule.MandatoryPlaceholder); - } - } - - public NodeState GetTypeObjectFor(string id) - { - var to = this.typeObject; // shall be NULL - if (id?.HasContent() != true) - return to; - - var idt = ExtendKey.GuessIdType(id); - if (idt == ExtendKey.IdType.IRI) - to = this.typeObjectUri; - else if (idt == ExtendKey.IdType.IRDI) - to = this.typeObjectIrdi; - else - to = this.typeObjectCustom; - return to; - } - - public NodeState CreateAddElements(NodeState parent, CreateMode mode, Aas.IConceptDescription cd = null, - AasUaNodeHelper.ModellingRule modellingRule = AasUaNodeHelper.ModellingRule.None) - { - if (parent == null) - return null; - - // split directly because of complexity - if (mode == CreateMode.Type) - { - // not sure, if this will required, ever - return null; - } - else - { - // access - if (cd == null) - return null; - - // makeup name - var name = "ConceptDescription_" + Guid.NewGuid().ToString(); - - if (false) -#pragma warning disable 162 - // ReSharper disable HeuristicUnreachableCode - { - // Conventional approach: build up a speaking name - // but: shall be target of "HasDictionaryEntry", therefore the __PURE__ identifications - // need to be the name! - if (cd.GetIEC61360() != null) - { - var ds = cd.GetIEC61360(); - if (ds.ShortName != null) - name = ds.ShortName.GetDefaultString(); - if (cd.Id != null) - name += "_" + cd.Id; - } - name = AasUaUtils.ToOpcUaName(name); - } - // ReSharper enable HeuristicUnreachableCode -#pragma warning restore 162 - else - { - // only identification (the type object will distinct between the id type) - if (cd.Id != null) - name = cd.Id; - } - - // containing element - var o = this.entityBuilder.CreateAddObject(parent, mode, name, - ReferenceTypeIds.HasComponent, this.GetTypeObjectFor(cd.Id)?.NodeId, - modellingRule: modellingRule); - - // Referable - this.entityBuilder.AasTypes.Referable.CreateAddElements( - o, CreateMode.Instance, cd); - // Identifiable - this.entityBuilder.AasTypes.Identification.CreateAddElements( - o, CreateMode.Instance, cd.Id); - this.entityBuilder.AasTypes.Administration.CreateAddElements( - o, CreateMode.Instance, cd.Administration); - // IsCaseOf - if (cd.IsCaseOf != null) - foreach (var ico in cd.IsCaseOf) - this.entityBuilder.AasTypes.Reference.CreateAddElements( - o, CreateMode.Instance, ico, "IsCaseOf"); - - // HasDataSpecification solely under the viewpoint of IEC61360 - var eds = cd.EmbeddedDataSpecifications?.FindFirstIEC61360Spec(); - if (eds != null) - this.entityBuilder.AasTypes.Reference.CreateAddElements( - o, CreateMode.Instance, eds.DataSpecification, "DataSpecification"); - - // data specification is a child - var ds61360 = cd.EmbeddedDataSpecifications?.GetIEC61360Content(); - if (ds61360 != null) - { - var unused = this.entityBuilder.AasTypes.DataSpecificationIEC61360.CreateAddElements( - o, CreateMode.Instance, - ds61360); - } - - // remember CD as NodeRecord - this.entityBuilder.AddNodeRecord(new AasEntityBuilder.NodeRecord(o, cd.Id)); - - return o; - } - } - } - - // - // Elements from the UA spc - // - - public class AasUaNamespaceZeroEntity : AasUaBaseEntity - { - public AasUaNamespaceZeroEntity(AasEntityBuilder entityBuilder, uint presetNumId = 0) - : base(entityBuilder) - { - // just set node id based on existing knowledge - this.typeObjectId = new NodeId(presetNumId, 0); - } - } - - public class AasUaNamespaceZeroReference : AasUaBaseEntity - { - public AasUaNamespaceZeroReference(AasEntityBuilder entityBuilder, uint presetNumId = 0) - : base(entityBuilder) - { - // just set node id based on existing knowledge - this.typeObjectId = new NodeId(presetNumId, 0); - } - - public void CreateAddInstanceReference(NodeState source, bool isInverse, ExpandedNodeId target) - { - if (source != null && target != null && this.GetTypeNodeId() != null) - source.AddReference(this.GetTypeNodeId(), isInverse, target); - } - } - - // - // References - // - - public class AasUaReferenceHasAasReference : AasUaBaseEntity - { - public AasUaReferenceHasAasReference(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - this.typeObject = this.entityBuilder.CreateAddReferenceType("AASReference", "AASReferencedBy", preferredTypeNumId, useZeroNS: false, extraSubtype: new NodeId(31, 0) /* request Florian */); - } - - public NodeState CreateAddInstanceReference(NodeState parent) - { - return null; - } - } - - - // - // Interfaces - // - - public class AasUaInterfaceAASIdentifiableType : AasUaBaseEntity - { - public AasUaInterfaceAASIdentifiableType(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - this.typeObject = this.entityBuilder.CreateAddObjectType("IAASIdentifiableType", - this.entityBuilder.AasTypes.IAASReferableType.GetTypeNodeId() /* ObjectTypeIds.BaseObjectType */, - preferredTypeNumId, descriptionKey: "AAS:Identifiable"); - - // add some elements - this.entityBuilder.AasTypes.Identification.CreateAddElements(this.typeObject, CreateMode.Type, - modellingRule: AasUaNodeHelper.ModellingRule.Mandatory); - this.entityBuilder.AasTypes.Administration.CreateAddElements(this.typeObject, CreateMode.Type, - modellingRule: AasUaNodeHelper.ModellingRule.Optional); - } - } - - public class AasUaInterfaceAASReferableType : AasUaBaseEntity - { - public AasUaInterfaceAASReferableType(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // create type object - this.typeObject = this.entityBuilder.CreateAddObjectType("IAASReferableType", - this.entityBuilder.AasTypes.BaseInterfaceType.GetTypeNodeId() /* ObjectTypeIds.BaseObjectType */, - preferredTypeNumId, descriptionKey: "AAS:Referable"); - - // some elements - this.entityBuilder.AasTypes.Referable.CreateAddElements(this.typeObject, CreateMode.Type); - } - } -} diff --git a/src/AasxUaNetServer/AasxServer/AasUaEntityFileType.cs b/src/AasxUaNetServer/AasxServer/AasUaEntityFileType.cs deleted file mode 100644 index 37f71d0c9..000000000 --- a/src/AasxUaNetServer/AasxServer/AasUaEntityFileType.cs +++ /dev/null @@ -1,392 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using AdminShellNS; -using Opc.Ua; -using System; -using System.Collections.Generic; -using System.IO; -using Aas = AasCore.Aas3_0; - -namespace AasOpcUaServer -{ - public class AasUaPackageFileHandler - { - private AdminShellPackageEnv _package = null; - private Aas.IFile _file = null; - - private class PackageFileHandle - { - public UInt32 handle = 0; - public UInt64 filepos = 0; - public Stream packStream = null; - - public int UaMode = 0; - public bool IsRead = true; - public bool IsWrite = true; - - public PackageFileHandle() { } - public PackageFileHandle(UInt32 handle) - { - this.handle = handle; - } - } - - private Dictionary handles = new Dictionary(); - - public AasUaPackageFileHandler(AdminShellPackageEnv package, Aas.IFile file) - { - this._package = package; - this._file = file; - } - - private UInt32 GetMaxHandle() - { - UInt32 mh = 0; - foreach (var x in handles.Keys) - mh = Math.Max(x, mh); - return mh; - } - - public UInt32 Open(Byte mode) - { - // access file handle - if (this._package == null || this._file == null) - throw new InvalidOperationException("no admin-shell package or file"); - var nh = GetMaxHandle() + 1; - var fh = new PackageFileHandle(nh); - fh.packStream = _package.GetLocalStreamFromPackage(_file.Value); - if (fh.packStream == null) - throw new InvalidOperationException("no admin-shell package or file"); - handles.Add(nh, fh); - - // care about the particularities of write - fh.UaMode = mode; - fh.IsRead = ((mode & 0x01) > 0); - fh.IsWrite = ((mode & 0x02) > 0); - if ((mode & 0x04) > 0) - { - // Erase existing - fh.packStream.Seek(0, SeekOrigin.Begin); - fh.packStream.SetLength(0); - fh.packStream.Flush(); - } - if ((mode & 0x08) > 0) - { - // Append - fh.packStream.Seek(0, SeekOrigin.End); - fh.packStream.Flush(); - } - - // done - return nh; - } - - public long GetLength(UInt32 handle) - { - if (!handles.ContainsKey(handle)) - throw new InvalidOperationException("handle is unknown"); - var h = handles[handle]; - return h.packStream.Length; - } - - public void Close(UInt32 handle) - { - if (!handles.ContainsKey(handle)) - throw new InvalidOperationException("handle is unknown"); - handles.Remove(handle); - } - - public void SetPosition(UInt32 handle, UInt64 pos) - { - if (!handles.ContainsKey(handle)) - throw new InvalidOperationException("handle is unknown"); - var h = handles[handle]; - h.filepos = pos; - } - - public UInt64 GetPosition(UInt32 handle) - { - if (!handles.ContainsKey(handle)) - throw new InvalidOperationException("handle is unknown"); - if (this._package == null || this._file == null) - throw new InvalidOperationException("no admin-shell package or file"); - var h = handles[handle]; - return h.filepos; - } - - public Byte[] Read(UInt32 handle, UInt32 readlen) - { - if (!handles.ContainsKey(handle)) - throw new InvalidOperationException("handle is unknown"); - if (this._package == null || this._file == null) - throw new InvalidOperationException("no admin-shell package or file"); - var h = handles[handle]; - if (h.packStream == null) - throw new InvalidOperationException("no open stream"); - if (h.filepos >= (ulong)h.packStream.Length) - throw new InvalidOperationException("invalid file position"); - - // Finding: 4.194.304 Bytes as requested by the UA Expert is too much - // Reduce zu 16bit Size, to show suitablility also for small devices - readlen = Math.Min(readlen, (2 << 15) - 1); - - byte[] res = new byte[readlen]; - h.packStream.Seek((long)h.filepos, SeekOrigin.Begin); - var redd = h.packStream.Read(res, 0, (int)readlen); - h.filepos += (UInt64)redd; - return res; - } - - public void Write(UInt32 handle, Byte[] data) - { - if (!handles.ContainsKey(handle)) - throw new InvalidOperationException("handle is unknown"); - if (this._package == null || this._file == null) - throw new InvalidOperationException("no admin-shell package or file"); - var h = handles[handle]; - if (h.packStream == null) - throw new InvalidOperationException("no open stream"); - - h.packStream.Write(data, 0, data.Length); - h.filepos += (ulong)data.Length; - } - } - - public class AasUaEntityFileType : AasUaBaseEntity - { - private class InstanceData - { - public AasUaPackageFileHandler packHandler = null; - public MethodState mOpen, mClose, mRead, mWrite, mSetPosition, mGetPosition; - public PropertyState nodeOpenCount = null; - public PropertyState nodeSize = null; - - public void UpdateSize(UInt64 size) - { - if (nodeSize != null) - nodeSize.Value = size; - } - } - - public AasUaEntityFileType(AasEntityBuilder entityBuilder, uint preferredTypeNumId = 0) - : base(entityBuilder) - { - // do NOT create type object, as they shall be all there in the UA constants - } - - /// - /// Checks, if a FileType node is advisable for representing an AASX file .. - /// Shall be TRUE for local, existing files .. - /// - /// - public bool CheckSuitablity(AdminShellPackageEnv package, Aas.IFile file) - { - // trivial - if (package == null || file == null) - return false; - - // try get a stream .. - Stream s = null; - try - { - s = package.GetLocalStreamFromPackage(file.Value); - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); - return false; - } - - // ok? - return s != null; - } - - public NodeState CreateAddElements(NodeState parent, CreateMode mode, - AdminShellPackageEnv package = null, Aas.IFile file = null) - { - // access - if (parent == null) - return null; - - // for sake of complexity, differentiate early - if (mode == CreateMode.Type) - { - var o = this.entityBuilder.CreateAddObject( - parent, mode, "File", ReferenceTypeIds.HasComponent, ObjectTypeIds.FileType); - return o; - } - else - { - if (package == null || file == null) - return null; - - var instData = new InstanceData(); - instData.packHandler = new AasUaPackageFileHandler(package, file); - - // containing element - var o = this.entityBuilder.CreateAddObject( - parent, mode, "File", ReferenceTypeIds.HasComponent, ObjectTypeIds.FileType); - - - // this first information is to provide a "off-the-shelf" size information; a Open() will re-new this - var fileLen = Convert.ToUInt64(package.GetStreamSizeFromPackage(file.Value)); - - // populate attributes from the spec - this.entityBuilder.CreateAddPropertyState(o, mode, "MimeType", - DataTypeIds.String, file.ContentType, ReferenceTypeIds.HasProperty, VariableTypeIds.PropertyType); - instData.nodeOpenCount = this.entityBuilder.CreateAddPropertyState(o, mode, "OpenCount", - DataTypeIds.UInt16, 0, ReferenceTypeIds.HasProperty, VariableTypeIds.PropertyType); - instData.nodeSize = this.entityBuilder.CreateAddPropertyState(o, mode, "Size", - DataTypeIds.UInt64, fileLen, ReferenceTypeIds.HasProperty, VariableTypeIds.PropertyType, - valueRank: -1); - this.entityBuilder.CreateAddPropertyState(o, mode, "UserWritable", - DataTypeIds.Boolean, true, ReferenceTypeIds.HasProperty, VariableTypeIds.PropertyType); - this.entityBuilder.CreateAddPropertyState(o, mode, "Writable", - DataTypeIds.Boolean, true, ReferenceTypeIds.HasProperty, VariableTypeIds.PropertyType); - - // Open - instData.mOpen = this.entityBuilder.CreateAddMethodState(o, mode, "Open", - inputArgs: new[] { - new Argument("Mode", DataTypeIds.Byte, -1, "") - }, - outputArgs: new[] { - new Argument("FileHandle", DataTypeIds.UInt32, -1, "") - }, referenceTypeFromParentId: ReferenceTypeIds.HasComponent, - methodDeclarationId: MethodIds.FileType_Open, onCalled: this.OnMethodCalled); - - this.entityBuilder.AddNodeStateAnnotation(instData.mOpen, instData); - - // Close - instData.mClose = this.entityBuilder.CreateAddMethodState(o, mode, "Close", - inputArgs: new[] { - new Argument("FileHandle", DataTypeIds.UInt32, -1, "") - }, - outputArgs: null, - referenceTypeFromParentId: ReferenceTypeIds.HasComponent, - methodDeclarationId: MethodIds.FileType_Close, onCalled: this.OnMethodCalled); - - this.entityBuilder.AddNodeStateAnnotation(instData.mClose, instData); - - // Read - instData.mRead = this.entityBuilder.CreateAddMethodState(o, mode, "Read", - inputArgs: new[] { - new Argument("FileHandle", DataTypeIds.UInt32, -1, ""), - new Argument("Length", DataTypeIds.Int32, -1, "") - }, - outputArgs: new[] { - new Argument("Data", DataTypeIds.ByteString, -1, "") - }, referenceTypeFromParentId: ReferenceTypeIds.HasComponent, - methodDeclarationId: MethodIds.FileType_Read, onCalled: this.OnMethodCalled); - - this.entityBuilder.AddNodeStateAnnotation(instData.mRead, instData); - - // Write - instData.mWrite = this.entityBuilder.CreateAddMethodState(o, mode, "Write", - inputArgs: new[] { - new Argument("FileHandle", DataTypeIds.UInt32, -1, ""), - new Argument("Data", DataTypeIds.ByteString, -1, "") - }, - outputArgs: null, - referenceTypeFromParentId: ReferenceTypeIds.HasComponent, - methodDeclarationId: MethodIds.FileType_Write, onCalled: this.OnMethodCalled); - - this.entityBuilder.AddNodeStateAnnotation(instData.mWrite, instData); - - // GetPosition - instData.mGetPosition = this.entityBuilder.CreateAddMethodState(o, mode, "GetPosition", - inputArgs: new[] { - new Argument("FileHandle", DataTypeIds.UInt32, -1, ""), - }, - outputArgs: new[] { - new Argument("Position", DataTypeIds.UInt64, -1, "") - }, - referenceTypeFromParentId: ReferenceTypeIds.HasComponent, - methodDeclarationId: MethodIds.FileType_GetPosition, onCalled: this.OnMethodCalled); - - this.entityBuilder.AddNodeStateAnnotation(instData.mGetPosition, instData); - - // SetPosition - instData.mSetPosition = this.entityBuilder.CreateAddMethodState(o, mode, "SetPosition", - inputArgs: new[] { - new Argument("FileHandle", DataTypeIds.UInt32, -1, ""), - new Argument("Position", DataTypeIds.UInt64, -1, "") - }, - outputArgs: null, - referenceTypeFromParentId: ReferenceTypeIds.HasComponent, - methodDeclarationId: MethodIds.FileType_SetPosition, onCalled: this.OnMethodCalled); - - this.entityBuilder.AddNodeStateAnnotation(instData.mSetPosition, instData); - - // result - return o; - } - } - - private ServiceResult OnMethodCalled( - ISystemContext context, - MethodState method, - IList inputArguments, - IList outputArguments) - { - var instData = this.entityBuilder.FindNoteStateAnnotation(method); - if (instData == null || instData.packHandler == null) - return new ServiceResult(StatusCodes.BadInvalidArgument); - - try - { - if (method == instData.mOpen) - { - var fh = instData.packHandler.Open((byte)inputArguments[0]); - instData.UpdateSize(Convert.ToUInt64(instData.packHandler.GetLength(fh))); - outputArguments[0] = fh; - } - - if (method == instData.mClose) - { - instData.packHandler.Close((UInt32)inputArguments[0]); - } - - if (method == instData.mSetPosition) - { - instData.packHandler.SetPosition((UInt32)inputArguments[0], (UInt64)inputArguments[1]); - } - - if (method == instData.mGetPosition) - { - outputArguments[0] = instData.packHandler.GetPosition((UInt32)inputArguments[0]); - } - - if (method == instData.mRead) - { - var data = instData.packHandler.Read( - Convert.ToUInt32(inputArguments[0]), Convert.ToUInt32(inputArguments[1])); - outputArguments[0] = data; - } - - if (method == instData.mWrite) - { - var fh = Convert.ToUInt32(inputArguments[0]); - instData.packHandler.Write(fh, (byte[])inputArguments[1]); - instData.UpdateSize(Convert.ToUInt64(instData.packHandler.GetLength(fh))); - } - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.Error(ex, "The method could not be executed."); - - // treat every exception the same - return new ServiceResult(StatusCodes.BadInvalidArgument); - } - - return new ServiceResult(StatusCodes.Good); - } - - } -} diff --git a/src/AasxUaNetServer/AasxServer/AasUaNodeHelper.cs b/src/AasxUaNetServer/AasxServer/AasUaNodeHelper.cs deleted file mode 100644 index 98c498f5e..000000000 --- a/src/AasxUaNetServer/AasxServer/AasUaNodeHelper.cs +++ /dev/null @@ -1,179 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using Opc.Ua; - -namespace AasOpcUaServer -{ - // ReSharper disable once ClassNeverInstantiated.Global - public class AasUaNodeHelper - { - /// - /// 4. The cardinality of an association or aggregation is specified via OPC Modelling rules. - /// The OPC modelling rule “Optional” is used if the cardinality is Zero or 1. - /// The OPC modelling rule “Mandatory” is used if the cardinality is One. - /// The OPC Modelling rule “OptionalPlaceholder” is used if the cardinality is zero, - /// one or more than one element. - /// The OPC Modelling rule “MandatoryPlaceholder” ” is used if the cardinality is one or more than one element. - /// - public enum ModellingRule { None, Optional, OptionalPlaceholder, Mandatory, MandatoryPlaceholder } - - /// - /// Try find out the Description for a certain AAS literal/ refSemantics - /// - public static LocalizedText SetLocalizedTextWithDescription(LocalizedText l, string key) - { - var dk = AasEntityDescriptions.LookupDescription(key); - - if (key != null) - { - l = new LocalizedText("en", dk); - } - - return l; - } - - /// - /// Appply modelling rule to an arbitrary node - /// - public static NodeState CheckSetModellingRule(ModellingRule modellingRule, NodeState o) - { - if (o == null || modellingRule == ModellingRule.None) - { - return o; - } - - if (modellingRule == ModellingRule.Optional) - { - o.AddReference(ReferenceTypeIds.HasModellingRule, false, ObjectIds.ModellingRule_Optional); - } - - if (modellingRule == ModellingRule.OptionalPlaceholder) - { - o.AddReference(ReferenceTypeIds.HasModellingRule, false, ObjectIds.ModellingRule_OptionalPlaceholder); - } - - if (modellingRule == ModellingRule.Mandatory) - { - o.AddReference(ReferenceTypeIds.HasModellingRule, false, ObjectIds.ModellingRule_Mandatory); - } - - if (modellingRule == ModellingRule.MandatoryPlaceholder) - { - o.AddReference(ReferenceTypeIds.HasModellingRule, false, ObjectIds.ModellingRule_MandatoryPlaceholder); - } - - return o; - } - - /// - /// Helper to create an ObjectType-Node. Note: __NO__ NodeId is created by the default! - /// Must be done by outer functionality!! - /// - /// Name displayed in the node tree - /// Base class or similar - /// Preset the NodeId - /// Lookup a Description on AAS literal/ refSemantics - /// Modeling Rule, if not None - /// THe node - public static BaseObjectTypeState CreateObjectType( - string browseDisplayName, - NodeId superTypeId, - NodeId presetNodeId = null, - string descriptionKey = null, - ModellingRule modellingRule = ModellingRule.None) - { - BaseObjectTypeState baseObjectType = new() - { - BrowseName = "" + browseDisplayName, - DisplayName = "" + browseDisplayName, - Description = SetLocalizedTextWithDescription(new LocalizedText("en", browseDisplayName), descriptionKey), - SuperTypeId = superTypeId - }; - - if (presetNodeId != null) - { - baseObjectType.NodeId = presetNodeId; - } - - CheckSetModellingRule(modellingRule, baseObjectType); - - return baseObjectType; - } - - /// - /// Helper to create an ReferenceType-Node. Note: __NO__ NodeId is created by the default! - /// Must be done by outer functionality!! - /// - /// Name displayed in the node tree - /// - /// Preset the NodeId - /// Preset the NodeId - /// - public static ReferenceTypeState CreateReferenceType( - string browseDisplayName, - string inverseName, - NodeId superTypeId, - NodeId presetNodeId = null) - { - ReferenceTypeState referenceType = new() - { - BrowseName = browseDisplayName, - DisplayName = browseDisplayName, - InverseName = inverseName, - Symmetric = false, - IsAbstract = false, - SuperTypeId = superTypeId - }; - - if (presetNodeId != null) - { - referenceType.NodeId = presetNodeId; - } - - return referenceType; - } - - /// - /// Helper to create an Object-Node. Note: __NO__ NodeId is created by the default! - /// Must be done by outer functionality!! - /// - /// Parent node - /// Name displayed in the node tree - /// Type of the Object - /// Modeling Rule, if not None - /// - /// The node - public static BaseObjectState CreateObject( - NodeState parent, - string browseDisplayName, - NodeId typeDefinitionId = null, - AasUaNodeHelper.ModellingRule modellingRule = AasUaNodeHelper.ModellingRule.None, - string extraName = null) - { - BaseObjectState baseObject = new(parent) - { - BrowseName = string.Empty + browseDisplayName, - DisplayName = string.Empty + browseDisplayName, - Description = new LocalizedText("en", string.Empty + browseDisplayName), - TypeDefinitionId = typeDefinitionId - }; - - if (extraName != null) - { - baseObject.DisplayName = extraName; - } - - CheckSetModellingRule(modellingRule, baseObject); - - return baseObject; - } - - } -} diff --git a/src/AasxUaNetServer/AasxServer/AasUaUtils.cs b/src/AasxUaNetServer/AasxServer/AasUaUtils.cs deleted file mode 100644 index 7f1867d38..000000000 --- a/src/AasxUaNetServer/AasxServer/AasUaUtils.cs +++ /dev/null @@ -1,223 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using AdminShellNS; -using Extensions; -using Opc.Ua; -using Aas = AasCore.Aas3_0; - -namespace AasOpcUaServer -{ - // ReSharper disable once ClassNeverInstantiated.Global - public class AasUaUtils - { - public static string ToOpcUaName(string input) - { - var clean = Regex.Replace(input, @"[^a-zA-Z0-9\-_]", "_"); - while (true) - { - var len0 = clean.Length; - clean = clean.Replace("__", "_"); - if (len0 == clean.Length) - break; - } - return clean; - } - - public static string ToOpcUaReference(Aas.IReference refid) - { - if (refid == null || refid.IsEmpty()) - return null; - - var semstr = ""; - foreach (var k in refid.Keys) - { - if (semstr != "") - semstr += ","; - semstr += String.Format("({0}){1}", k.Type, k.Value); - } - - return semstr; - } - - public static List ToOpcUaReferenceList(Aas.IReference refid) - { - if (refid == null || refid.IsEmpty()) - return null; - - var res = new List(); - foreach (var k in refid.Keys) - { - res.Add(String.Format("({0}){1}", k.Type, k.Value)); - } - - return res; - } - - public static LocalizedText[] GetUaLocalizedTexts(IList ls) - { - if (ls == null || ls.Count < 1) - return new[] { new LocalizedText("", "") }; - var res = new LocalizedText[ls.Count]; - for (int i = 0; i < ls.Count; i++) - res[i] = new LocalizedText(ls[i].Language, ls[i].Text); - return res; - } - - public static LocalizedText[] GetUaLocalizedTexts(IList ls) - { - if (ls == null || ls.Count < 1) - return new[] { new LocalizedText("", "") }; - var res = new LocalizedText[ls.Count]; - for (int i = 0; i < ls.Count; i++) - res[i] = new LocalizedText(ls[i].Language, ls[i].Text); - return res; - } - - public static LocalizedText[] GetUaLocalizedTexts(IList ls) - { - if (ls == null || ls.Count < 1) - return new[] { new LocalizedText("", "") }; - var res = new LocalizedText[ls.Count]; - for (int i = 0; i < ls.Count; i++) - res[i] = new LocalizedText(ls[i].Language, ls[i].Text); - return res; - } - - public static LocalizedText[] GetUaLocalizedTexts(IList ls) - { - if (ls == null || ls.Count < 1) - return new[] { new LocalizedText("", "") }; - var res = new LocalizedText[ls.Count]; - for (int i = 0; i < ls.Count; i++) - res[i] = new LocalizedText(ls[i].Language, ls[i].Text); - return res; - } - - public static LocalizedText GetBestUaDescriptionFromAasDescription(List desc) - { - var res = new LocalizedText("", ""); - if (desc != null) - { - var found = false; - foreach (var ls in desc) - if (!found || ls.Language.Trim().ToLower().StartsWith("en")) - { - found = true; - res = new LocalizedText(ls.Language, ls.Text); - } - } - return res; - } - - public static bool AasValueTypeToUaDataType( - Aas.DataTypeDefXsd valueType, out Type sharpType, out NodeId dataTypeId) - { - // defaults - sharpType = "".GetType(); - dataTypeId = DataTypeIds.String; - - // parse - if (valueType == Aas.DataTypeDefXsd.Boolean) - { - sharpType = typeof(bool); - dataTypeId = DataTypeIds.Boolean; - return true; - } - else if (valueType == Aas.DataTypeDefXsd.DateTime - || valueType == Aas.DataTypeDefXsd.Date - || valueType == Aas.DataTypeDefXsd.Time) - { - sharpType = typeof(Int64); - dataTypeId = DataTypeIds.DateTime; - return true; - } - else if (valueType == Aas.DataTypeDefXsd.Decimal - || valueType == Aas.DataTypeDefXsd.Integer - || valueType == Aas.DataTypeDefXsd.Long - || valueType == Aas.DataTypeDefXsd.NonPositiveInteger - || valueType == Aas.DataTypeDefXsd.NegativeInteger) - { - sharpType = typeof(Int64); - dataTypeId = DataTypeIds.Int64; - return true; - } - else if (valueType == Aas.DataTypeDefXsd.Int) - { - sharpType = typeof(Int32); - dataTypeId = DataTypeIds.Int32; - return true; - } - else if (valueType == Aas.DataTypeDefXsd.Short) - { - sharpType = typeof(Int16); - dataTypeId = DataTypeIds.Int16; - return true; - } - else if (valueType == Aas.DataTypeDefXsd.Byte) - { - sharpType = typeof(SByte); - dataTypeId = DataTypeIds.Byte; - return true; - } - else if (valueType == Aas.DataTypeDefXsd.NonNegativeInteger - || valueType == Aas.DataTypeDefXsd.PositiveInteger - || valueType == Aas.DataTypeDefXsd.UnsignedLong) - { - sharpType = typeof(UInt64); - dataTypeId = DataTypeIds.UInt64; - return true; - } - else if (valueType == Aas.DataTypeDefXsd.UnsignedInt) - { - sharpType = typeof(UInt32); - dataTypeId = DataTypeIds.UInt32; - return true; - } - else if (valueType == Aas.DataTypeDefXsd.UnsignedShort) - { - sharpType = typeof(UInt16); - dataTypeId = DataTypeIds.UInt16; - return true; - } - else if (valueType == Aas.DataTypeDefXsd.UnsignedByte) - { - sharpType = typeof(Byte); - dataTypeId = DataTypeIds.Byte; - return true; - } - else if (valueType == Aas.DataTypeDefXsd.Double) - { - sharpType = typeof(double); - dataTypeId = DataTypeIds.Double; - return true; - } - else if (valueType == Aas.DataTypeDefXsd.Float) - { - sharpType = typeof(float); - dataTypeId = DataTypeIds.Float; - return true; - } - else if (valueType == Aas.DataTypeDefXsd.String) - { - sharpType = typeof(string); - dataTypeId = DataTypeIds.String; - return true; - } - - return false; - } - } -} diff --git a/src/AasxUaNetServer/AasxServer/AasxUaServerOptions.cs b/src/AasxUaNetServer/AasxServer/AasxUaServerOptions.cs deleted file mode 100644 index 22b4196c0..000000000 --- a/src/AasxUaNetServer/AasxServer/AasxUaServerOptions.cs +++ /dev/null @@ -1,140 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace AasOpcUaServer -{ - public class AasxUaServerOptions - { - public enum JobType { None, ExportNodesetXml } - - /// - /// This file shall be loaded at start of application - /// - public string AasxToLoad = null; - - /// - /// Set special action/ job to be executed by server - /// - public JobType SpecialJob = JobType.None; - - /// - /// File Name for exporting - /// - public string ExportFilename = ""; - - /// - /// If not Null, the Namespace index of exported nodes need to be in the list. - /// - public List ExportFilterNamespaceIndex = null; - - /// - /// Serialize reference as single string object instead of list of strings. - /// Note: set to TRUE for open62541 node-set-compiler - /// - public bool ReferenceKeysAsSingleString = false; - - /// - /// Filter duplicated node-ids in th export. - /// Note: set to TRUE for open62541 node-set-compiler - /// - public bool FilterForSingleNodeIds = false; - - /// - /// If not null, then executed after finalizing special jobs. Will be set-up during initialization of server. - /// - public Action FinalizeAction = null; - - /// - /// If true, usage of customised data types will be reduced - /// - public bool SimpleDataTypes = false; - - /// - /// Set true, if descendants from "Object" (AASROOT, CDs) shall be linked as components, not - /// via Organizes - relationship. - /// - public bool LinkRootAsComponent = false; - - /// - /// Seemingly, in older versions, the dictionaries folder was missing - /// - public bool CeateDictionariesFolder = true; - - /// - /// Parse args given by command line or plug-in arguments - /// - public void ParseArgs(string[] args) - { - if (args == null) - return; - - for (int index = 0; index < args.Length; index++) - { - var arg = args[index].Trim().ToLower(); - var morearg = (args.Length - 1) - index; - - // flags - if (arg == "-single-keys") - { - ReferenceKeysAsSingleString = true; - continue; - } - - if (arg == "-single-nodeids") - { - FilterForSingleNodeIds = true; - continue; - } - - if (arg == "-simple-data-types") - { - SimpleDataTypes = true; - continue; - } - - if (arg == "-link-root-as-component") - { - LinkRootAsComponent = true; - continue; - } - - // options - if (arg == "-ns" && morearg > 0) - { - if (Int32.TryParse(args[index + 1], out var i)) - { - if (this.ExportFilterNamespaceIndex == null) - this.ExportFilterNamespaceIndex = new List(); - this.ExportFilterNamespaceIndex.Add((ushort)i); - } - index++; - continue; - } - if (arg == "-export-nodeset" && morearg > 0) - { - this.SpecialJob = JobType.ExportNodesetXml; - this.ExportFilename = args[index + 1]; - index++; - continue; - } - - // tail. last argument shall be file to load - if (System.IO.File.Exists(args[index])) - this.AasxToLoad = args[index]; - break; - } - } - } -} diff --git a/src/AasxUaNetServer/AasxUaNetServer.csproj b/src/AasxUaNetServer/AasxUaNetServer.csproj deleted file mode 100644 index 57ad1c6b8..000000000 --- a/src/AasxUaNetServer/AasxUaNetServer.csproj +++ /dev/null @@ -1,21 +0,0 @@ - - - net6.0 - Library - true - false - false - - - - - - - - - - - PreserveNewest - - - diff --git a/src/AasxUaNetServer/LICENSE.txt b/src/AasxUaNetServer/LICENSE.txt deleted file mode 100644 index 01f9cb5eb..000000000 --- a/src/AasxUaNetServer/LICENSE.txt +++ /dev/null @@ -1,1475 +0,0 @@ -Copyright (c) 2018-2023 Festo SE & Co. KG -, -author: Michael Hoffmeister - -Copyright (c) 2019-2021 PHOENIX CONTACT GmbH & Co. KG -, -author: Andreas Orzelski - -Copyright (c) 2019-2020 Fraunhofer IOSB-INA Lemgo, - eine rechtlich nicht selbstaendige Einrichtung der Fraunhofer-Gesellschaft - zur Foerderung der angewandten Forschung e.V. - -Copyright (c) 2020 Schneider Electric Automation GmbH -, -author: Marco Mendes - -Copyright (c) 2020 SICK AG - -Copyright (c) 2021 KEB Automation KG - -Copyright (c) 2021 Lenze SE -author: Jonas Grote, Denis Göllner, Sebastian Bischof - -The AASX Package Explorer is licensed under the Apache License 2.0 -(Apache-2.0, see below). - -The AASX Package Explorer is a sample application for demonstration of the -features of the Asset Administration Shell. -The implementation uses the concepts of the document "Details of the Asset -Administration Shell" published on www.plattform-i40.de which is licensed -under Creative Commons CC BY-ND 3.0 DE. - -When using eCl@ss or IEC CDD data, please check the corresponding license -conditions. - -------------------------------------------------------------------------------- - -The components below are used in AASX Package Explorer. -The related licenses are listed for information purposes only. -Some licenses may only apply to their related plugins. - -The browser functionality is licensed under the cefSharp license (see below). - -The Newtonsoft.JSON serialization is licensed under the MIT License -(MIT, see below). - -The QR code generation is licensed under the MIT license (MIT, see below). - -The Zxing.Net Dot Matrix Code (DMC) generation is licensed under -the Apache License 2.0 (Apache-2.0, see below). - -The Grapevine REST server framework is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The AutomationML.Engine is licensed under the MIT license (MIT, see below). - -The MQTT server and client is licensed under the MIT license (MIT, see below). - -The ClosedXML Excel reader/writer is licensed under the MIT license (MIT, -see below). - -The CountryFlag WPF control is licensed under the Code Project Open License -(CPOL, see below). - -The DocumentFormat.OpenXml SDK is licensed under the MIT license (MIT, -see below). - -The ExcelNumberFormat number parser is licensed under the MIT license (MIT, -see below). - -The FastMember reflection access is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The IdentityModel OpenID client is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The jose-jwt object signing and encryption is licensed under the -MIT license (MIT, see below). - -The ExcelDataReader is licensed under the MIT license (MIT, see below). - -Portions copyright (c) by OPC Foundation, Inc. and licensed under the -Reciprocal Community License (RCL, see below) - -The OPC UA Example Code of OPC UA Standard is licensed under the MIT license -(MIT, see below). - -The MSAGL (Microsoft Automatic Graph Layout) is licensed under the MIT license -(MIT, see below) - -Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license -(MIT, see below). - -The Magick.NET library is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed -under Apache License 2.0 (Apache-2.0, see below). - -------------------------------------------------------------------------------- - - -With respect to AASX Package Explorer -===================================== - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to cefSharp -======================== - -(https://raw.githubusercontent.com/cefsharp/CefSharp/master/LICENSE) - -Copyright © The CefSharp Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - * Neither the name of Google Inc. nor the name Chromium Embedded - Framework nor the name CefSharp nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -With respect to Newtonsoft.Json -=============================== - -(https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md) - -The MIT License (MIT) - -Copyright (c) 2007 James Newton-King - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to QRcoder -======================= - -(https://github.com/codebude/QRCoder/blob/master/LICENSE.txt) - -The MIT License (MIT) - -Copyright (c) 2013-2018 Raffael Herrmann - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to ZXing.Net -========================= -With respect to Grapevine -========================= -With respect to FastMember -========================== -With respect to IdentityModel -============================= - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to AutomationML.Engine -=================================== - -(https://raw.githubusercontent.com/AutomationML/AMLEngine2.1/master/license.txt) - -The MIT License (MIT) - -Copyright 2017 AutomationML e.V. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - -With respect to MQTTnet -======================= - -(https://github.com/chkr1011/MQTTnet/blob/master/LICENSE) - -MIT License - -MQTTnet Copyright (c) 2016-2019 Christian Kratky - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to ClosedXML -========================= - -(https://github.com/ClosedXML/ClosedXML/blob/develop/LICENSE) - -MIT License - -Copyright (c) 2016 ClosedXML - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to CountryFlag -=========================== - -(https://www.codeproject.com/Articles/190722/WPF-CountryFlag-Control) - -The Code Project Open License (CPOL) 1.02 - -Copyright © 2017 Meshack Musundi - -Preamble - -This License governs Your use of the Work. This License is intended to allow -developers to use the Source Code and Executable Files provided as part of -the Work in any application in any form. - -The main points subject to the terms of the License are: - - Source Code and Executable Files can be used in commercial applications; - Source Code and Executable Files can be redistributed; and - Source Code can be modified to create derivative works. - No claim of suitability, guarantee, or any warranty whatsoever is provided. - The software is provided "as-is". - The Article(s) accompanying the Work may not be distributed or republished - without the Author's consent - -This License is entered between You, the individual or other entity reading or -otherwise making use of the Work licensed pursuant to this License and the -individual or other entity which offers the Work under the terms of this -License ("Author"). - -License - -THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS -CODE PROJECT OPEN LICENSE ("LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT -AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED -UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. - -BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HEREIN, YOU ACCEPT AND AGREE -TO BE BOUND BY THE TERMS OF THIS LICENSE. THE AUTHOR GRANTS YOU THE RIGHTS -CONTAINED HEREIN IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND -CONDITIONS. IF YOU DO NOT AGREE TO ACCEPT AND BE BOUND BY THE TERMS OF THIS -LICENSE, YOU CANNOT MAKE ANY USE OF THE WORK. - -Definitions. - "Articles" means, collectively, all articles written by Author which -describes how the Source Code and Executable Files for the Work may -be used by a user. - "Author" means the individual or entity that offers the Work under -the terms of this License. - "Derivative Work" means a work based upon the Work or upon the Work -and other pre-existing works. - "Executable Files" refer to the executables, binary files, -configuration and any required data files included in the Work. - "Publisher" means the provider of the website, magazine, CD-ROM, -DVD or other medium from or by which the Work is obtained by You. - "Source Code" refers to the collection of source code and -configuration files used to create the Executable Files. - "Standard Version" refers to such a Work if it has not been modified, -or has been modified in accordance with the consent of the Author, -such consent being in the full discretion of the Author. - "Work" refers to the collection of files distributed by the Publisher, -including the Source Code, Executable Files, binaries, data files, -documentation, whitepapers and the Articles. - "You" is you, an individual or entity wishing to use the Work and -exercise your rights under this License. - -Fair Use/Fair Use Rights. Nothing in this License is intended to reduce, -limit, or restrict any rights arising from fair use, fair dealing, -first sale or other limitations on the exclusive rights of the -copyright owner under copyright law or other applicable laws. - -License Grant. Subject to the terms and conditions of this License, the -Author hereby grants You a worldwide, royalty-free, non-exclusive, -perpetual (for the duration of the applicable copyright) license -to exercise the rights in the Work as stated below: - You may use the standard version of the Source Code or Executable -Files in Your own applications. - You may apply bug fixes, portability fixes and other modifications -obtained from the Public Domain or from the Author. A Work modified -in such a way shall still be considered the standard version and will -be subject to this License. - You may otherwise modify Your copy of this Work (excluding the Articles) -in any way to create a Derivative Work, provided that You insert a prominent -notice in each changed file stating how, when and where You changed that file. - You may distribute the standard version of the Executable Files and Source -Code or Derivative Work in aggregate with other (possibly commercial) -programs as part of a larger (possibly commercial) software distribution. - The Articles discussing the Work published in any form by the author may -not be distributed or republished without the Author's consent. The author -retains copyright to any such Articles. You may use the Executable Files and -Source Code pursuant to this License but you may not repost or republish or -otherwise distribute or make available the Articles, without the prior written -consent of the Author. - -Any subroutines or modules supplied by You and linked into the Source Code -or Executable Files of this Work shall not be considered part of this Work -and will not be subject to the terms of this License. - -Patent License. Subject to the terms and conditions of this License, each -Author hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, -royalty-free, irrevocable (except as stated in this section) patent license -to make, have made, use, import, and otherwise transfer the Work. - -Restrictions. The license granted in Section 3 above is expressly made subject -to and limited by the following restrictions: - You agree not to remove any of the original copyright, patent, trademark, -and attribution notices and associated disclaimers that may appear in the -Source Code or Executable Files. - You agree not to advertise or in any way imply that this Work is a product -of Your own. - The name of the Author may not be used to endorse or promote products -derived from the Work without the prior written consent of the Author. - You agree not to sell, lease, or rent any part of the Work. This does -not restrict you from including the Work or any part of the Work inside -a larger software distribution that itself is being sold. The Work by itself, -though, cannot be sold, leased or rented. - You may distribute the Executable Files and Source Code only under the terms -of this License, and You must include a copy of, or the Uniform Resource -Identifier for, this License with every copy of the Executable Files or -Source Code You distribute and ensure that anyone receiving such Executable -Files and Source Code agrees that the terms of this License apply to such -Executable Files and/or Source Code. You may not offer or impose any terms -on the Work that alter or restrict the terms of this License or the -recipients' exercise of the rights granted hereunder. You may not sublicense -the Work. You must keep intact all notices that refer to this License and to -the disclaimer of warranties. You may not distribute the Executable Files or -Source Code with any technological measures that control access or use of the -Work in a manner inconsistent with the terms of this License. - You agree not to use the Work for illegal, immoral or improper -purposes, or on pages containing illegal, immoral or improper material. -The Work is subject to applicable export laws. You agree to comply with all -such laws and regulations that may apply to the Work after Your receipt of -the Work. - -Representations, Warranties and Disclaimer. THIS WORK IS PROVIDED "AS IS", -"WHERE IS" AND "AS AVAILABLE", WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OR -CONDITIONS OR GUARANTEES. YOU, THE USER, ASSUME ALL RISK IN ITS USE, -INCLUDING COPYRIGHT INFRINGEMENT, PATENT INFRINGEMENT, SUITABILITY, ETC. -AUTHOR EXPRESSLY DISCLAIMS ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES -OR CONDITIONS, INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS -OF MERCHANTABILITY, MERCHANTABLE QUALITY OR FITNESS FOR A PARTICULAR -PURPOSE, OR ANY WARRANTY OF TITLE OR NON-INFRINGEMENT, OR THAT THE WORK -(OR ANY PORTION THEREOF) IS CORRECT, USEFUL, BUG-FREE OR FREE OF VIRUSES. -YOU MUST PASS THIS DISCLAIMER ON WHENEVER YOU DISTRIBUTE THE WORK OR DERIVATIVE -WORKS. - -Indemnity. You agree to defend, indemnify and hold harmless the Author and the -Publisher from and against any claims, suits, losses, damages, liabilities, -costs, and expenses (including reasonable legal or attorneys’ fees) -resulting from or relating to any use of the Work by You. - -Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, -IN NO EVENT WILL THE AUTHOR OR THE PUBLISHER BE LIABLE TO YOU ON ANY LEGAL -THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY -DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK OR OTHERWISE, -EVEN IF THE AUTHOR OR THE PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY -OF SUCH DAMAGES. - -Termination. - This License and the rights granted hereunder will terminate -automatically upon any breach by You of any term of this License. -Individuals or entities who have received Derivative Works from You under -this License, however, will not have their licenses terminated provided such -individuals or entities remain in full compliance with those licenses. -Sections 1, 2, 6, 7, 8, 9, 10 and 11 will survive any termination of -this License. - If You bring a copyright, trademark, patent or any other infringement -claim against any contributor over infringements You claim are made by the -Work, your License from such contributor to the Work ends automatically. - Subject to the above terms and conditions, this License is perpetual -(for the duration of the applicable copyright in the Work). -Notwithstanding the above, the Author reserves the right to release the Work -under different license terms or to stop distributing the Work at any time; -provided, however that any such election will not serve to withdraw this -License (or any other license that has been, or is required to be, -granted under the terms of this License), and this License will continue -in full force and effect unless terminated as stated above. - -Publisher. The parties hereby confirm that the Publisher shall not, under -any circumstances, be responsible for and shall not have any liability -in respect of the subject matter of this License. The Publisher makes no -warranty whatsoever in connection with the Work and shall not be liable -to You or any party on any legal theory for any damages whatsoever, including -without limitation any general, special, incidental or consequential damages -arising in connection to this license. The Publisher reserves the right to -cease making the Work available to You at any time without notice - -Miscellaneous - This License shall be governed by the laws of the location of the head -office of the Author or if the Author is an individual, the laws of -location of the principal place of residence of the Author. - If any provision of this License is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of the -remainder of the terms of this License, and without further action by the -parties to this License, such provision shall be reformed to the minimum -extent necessary to make such provision valid and enforceable. - No term or provision of this License shall be deemed waived and no -breach consented to unless such waiver or consent shall be in writing -and signed by the party to be charged with such waiver or consent. - This License constitutes the entire agreement between the parties -with respect to the Work licensed herein. There are no understandings, -agreements or representations with respect to the Work not specified herein. -The Author shall not be bound by any additional provisions that may appear -in any communication from You. This License may not be modified without -the mutual written agreement of the Author and You. - - -With respect to DocumentFormat.OpenXml -====================================== - -(https://github.com/OfficeDev/Open-XML-SDK/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to ExcelNumberFormat -================================= - -(https://github.com/andersnm/ExcelNumberFormat/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2017 andersnm - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to jose-jwt -======================== - -(https://github.com/dvsekhvalnov/jose-jwt/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014-2019 dvsekhvalnov - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With resepect to ExcelDataReader -================================ - -(https://github.com/ExcelDataReader/ExcelDataReader/blob/develop/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014 ExcelDataReader - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepect to OPC UA Example Code -==================================== - - * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved. - * - * OPC Foundation MIT License 1.00 - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * The complete license agreement can be found here: - * http://opcfoundation.org/License/MIT/1.00/ - - -With respect to OPC Foundation -============================== - -RCL License -Reciprocal Community License 1.00 (RCL1.00) -Version 1.00, June 24, 2009 -Copyright (C) 2008,2009 OPC Foundation, Inc., All Rights Reserved. - -https://opcfoundation.org/license/rcl.html - -Remark: PHOENIX CONTACT GmbH & Co. KG and Festo SE & Co. KG are members -of OPC foundation. - -With respect to MSAGL (Microsoft Automatic Graph Layout) -======================================================== -(see: https://github.com/microsoft/automatic-graph-layout/blob/master/LICENSE) - -Microsoft Automatic Graph Layout, MSAGL - -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -""Software""), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With respect to Glob (https://www.nuget.org/packages/Glob/) -=========================================================== -(see: https://raw.githubusercontent.com/kthompson/glob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2013-2019 Kevin Thompson - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to Magick.NET -========================== - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -With respect to SSharp.NET library -================================== - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/src/AasxUaNetServer/Properties/AssemblyInfo.cs b/src/AasxUaNetServer/Properties/AssemblyInfo.cs deleted file mode 100644 index b50330fe2..000000000 --- a/src/AasxUaNetServer/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die einer Assembly zugeordnet sind. -[assembly: AssemblyTitle("AasxUaNetServer")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("AasxUaNetServer")] -[assembly: AssemblyCopyright("Copyright © 2020")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly -// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von -// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. -[assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird -[assembly: Guid("c1e3f0d9-2bea-4668-aff4-454fdf527a58")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, -// übernehmen, indem Sie "*" eingeben: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/AasxUaNetServer/SampleServer.cs b/src/AasxUaNetServer/SampleServer.cs deleted file mode 100644 index 91f3cca99..000000000 --- a/src/AasxUaNetServer/SampleServer.cs +++ /dev/null @@ -1,105 +0,0 @@ -// SOURCE: https://github.com/OPCFoundation/UA-.NETStandard/blob/1.4.355.26/SampleApplications/ -// Samples/Opc.Ua.Sample/SampleServer.cs - -/* ======================================================================== - * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved. - * - * OPC Foundation MIT License 1.00 - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * The complete license agreement can be found here: - * http://opcfoundation.org/License/MIT/1.00/ - * ======================================================================*/ - -// ReSharper disable all - -using System.Collections.Generic; -using System.Diagnostics; -using AdminShellNS; -using Opc.Ua; -using Opc.Ua.Server; - -namespace AasOpcUaServer -{ - /// - /// A class which implements an instance of a UA server. - /// - public partial class SampleServer : StandardServer - { - private AdminShellPackageEnv thePackageEnv = null; - private AasxUaServerOptions theServerOptions = null; - - public SampleServer(AdminShellPackageEnv env, AasxUaServerOptions serverOptions = null) - : base() - { - thePackageEnv = env; - theServerOptions = serverOptions; - } - - /// - /// Creates the node managers for the server. - /// - /// - /// This method allows the sub-class create any additional node managers which it uses. The SDK - /// always creates a CoreNodeManager which handles the built-in nodes defined by the specification. - /// Any additional NodeManagers are expected to handle application specific nodes. - /// - /// Applications with small address spaces do not need to create their own NodeManagers and can add any - /// application specific nodes to the CoreNodeManager. Applications should use custom NodeManagers when - /// the structure of the address space is stored in another system or when the address space is too large - /// to keep in memory. - /// - protected override MasterNodeManager CreateMasterNodeManager( - IServerInternal server, ApplicationConfiguration configuration) - { - Debug.WriteLine("Creating the Node Managers."); - - List nodeManagers = new() - { - new AasNodeManager(server, configuration, thePackageEnv, theServerOptions) - }; - - return new MasterNodeManager(server, configuration, null, nodeManagers.ToArray()); - } - - /// - /// Loads the non-configurable properties for the application. - /// - /// - /// These properties are exposed by the server but cannot be changed by administrators. - /// - protected override ServerProperties LoadServerProperties() - { - ServerProperties properties = new() - { - ManufacturerName = "OPC Foundation", - ProductName = "OPC UA SDK Samples", - ProductUri = "http://opcfoundation.org/UA/Samples/v1.0", - SoftwareVersion = Utils.GetAssemblySoftwareVersion(), - BuildNumber = Utils.GetAssemblyBuildNumber(), - BuildDate = Utils.GetAssemblyTimestamp() - }; - - return properties; - } - } -} diff --git a/src/AasxUaNetServer/UaServerWrapper.cs b/src/AasxUaNetServer/UaServerWrapper.cs deleted file mode 100644 index eb8851381..000000000 --- a/src/AasxUaNetServer/UaServerWrapper.cs +++ /dev/null @@ -1,282 +0,0 @@ -// SOURCE: https://github.com/OPCFoundation/UA-.NETStandard/blob/1.4.355.26/ -// SampleApplications/Samples/NetCoreConsoleServer/Program.cs -// heavily modified -// the (actual) Source is this: https://github.com/OPCFoundation/UA-.NETStandard/blob/master/Applications/ -// ConsoleReferenceServer/Program.cs -// it now features the MIT license! - -/* ======================================================================== - * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved. - * - * OPC Foundation MIT License 1.00 - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * The complete license agreement can be found here: - * http://opcfoundation.org/License/MIT/1.00/ - * ======================================================================*/ - -using AasOpcUaServer; -using AasxIntegrationBase; -using AdminShellNS; -using Opc.Ua; -using Opc.Ua.Configuration; -using Opc.Ua.Server; -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using System.Threading; -using System.Threading.Tasks; - -namespace AasxUaNetServer -{ - - public enum ExitCode - { - Ok = 0, - ErrorServerNotStarted = 0x80, - ErrorServerRunning = 0x81, - ErrorServerException = 0x82, - ErrorInvalidCommandLine = 0x100 - }; - - public class UaServerWrapper - { - private LogInstance Log = null; - SampleServer server; - Task status; - DateTime lastEventTime; - int serverRunTime = Timeout.Infinite; - static ExitCode exitCode; - static AdminShellPackageEnv aasxEnv = null; - static AasxUaServerOptions aasxServerOptions = null; - - public bool IgnoreFurtherErrors = false; - public bool AllowFinallyStopped = true; - public bool FinallyStopped = false; - - public UaServerWrapper(int _stopTimeout, AdminShellPackageEnv _aasxEnv, LogInstance logger = null, AasxUaServerOptions _serverOptions = null) - { - aasxEnv = _aasxEnv; - aasxServerOptions = _serverOptions; - serverRunTime = _stopTimeout == 0 ? Timeout.Infinite : _stopTimeout * 1000; - this.Log = logger; - } - - public void Run() - { - - try - { - exitCode = ExitCode.ErrorServerNotStarted; - Log.Info("will start.........."); - ConsoleSampleServer().Wait(); - Console.WriteLine("Server started."); - exitCode = ExitCode.Ok; - } - catch (Exception ex) - { - var st = ex.Message; - if (!(IgnoreFurtherErrors && (st.Contains("Mindestens ein") || st.Contains("At least")))) - { - Utils.Trace("ServiceResultException:" + st); - Log.Error(ex, "starting server"); - Console.WriteLine("Exception: {0}", ex.Message); - exitCode = ExitCode.ErrorServerException; - Stop(); - FinallyStopped = AllowFinallyStopped; - } - } - } - - public void Stop() - { - if (server != null) - { - Console.WriteLine("Server stopped. Waiting for exit..."); - - using (SampleServer _server = server) - { - // Stop status thread - server = null; - if (status != null) - status.Wait(); - // Stop server and dispose - if (_server != null) - _server.Stop(); - - FinallyStopped = AllowFinallyStopped; - - Log.Info("End of Server stopping!"); - } - } - } - - private static bool _traceHandleAttached = false; - - private async Task ConsoleSampleServer() - { - ApplicationInstance application = new ApplicationInstance(); - - application.ApplicationName = "OPC UA AASX Server plugin"; - application.ApplicationType = ApplicationType.Server; - application.ConfigSectionName = Utils.IsRunningOnMono() ? "MonoAasxServerPlugin" : "AasxPluginUaNetServer"; - - // modify ConfigSectionName with absoluet file? - if (true) - { - string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - application.ConfigSectionName = Path.Combine(assemblyFolder, application.ConfigSectionName); - } - - // load the application configuration. - ApplicationConfiguration config = await application.LoadApplicationConfiguration(false); - - // check the application certificate. - if (!await application.CheckApplicationInstanceCertificate(false, 0)) - { - throw new Exception("Application instance certificate invalid!"); - } - - // Important: set appropriate trace mask - Utils.SetTraceMask(Utils.TraceMasks.Error - | Utils.TraceMasks.Information - | Utils.TraceMasks.StartStop - | Utils.TraceMasks.StackTrace); - - // attach tracing? - if (!_traceHandleAttached) - { - _traceHandleAttached = true; - Utils.Tracing.TraceEventHandler += (sender, args) => - { - if (this.Log != null) - { - // bad hack - if (args == null) - return; - if (args.TraceMask == Utils.TraceMasks.Information - || args.TraceMask == Utils.TraceMasks.Service - || args.TraceMask == Utils.TraceMasks.ServiceDetail) - return; - - var st = String.Format(args.Format, - // ReSharper disable once CoVariantArrayConversion - // ReSharper disable once RedundantExplicitArrayCreation - (args.Arguments != null ? args.Arguments : new string[] { "" })); - - // supports specially knows errors - if (true == args.Exception?.InnerException?.Message?.Contains("libuv")) - return; - - // suppress more errors? - if (st.Contains("Mindestens ein") || st.Contains("At least")) - { - if (IgnoreFurtherErrors) - return; - } - - // errors lead to not automatically close window? - if (!IgnoreFurtherErrors && args.TraceMask == Utils.TraceMasks.Error) - AllowFinallyStopped = false; - - this.Log.Info("[{0}] {1} {2} {3} {4}", - args.TraceMask, st, args.Message, "" + args.Exception?.Message, - "" + args.Exception?.StackTrace); - } - }; - } - - // allow stopping after finalizing special jobs - if (aasxServerOptions != null) - aasxServerOptions.FinalizeAction += () => - { - //// server.Stop(); - // changed to the following to close the window, as well - Stop(); - IgnoreFurtherErrors = true; - }; - - // start the server. - server = new SampleServer(aasxEnv, aasxServerOptions); - await application.Start(server); - - // start the status thread - // ReSharper disable once RedundantDelegateCreation - status = Task.Run(new Action(StatusThread)); - - // print notification on session events - server.CurrentInstance.SessionManager.SessionActivated += EventStatus; - server.CurrentInstance.SessionManager.SessionClosing += EventStatus; - server.CurrentInstance.SessionManager.SessionCreated += EventStatus; - - } - - private void EventStatus(Session session, SessionEventReason reason) - { - lastEventTime = DateTime.UtcNow; - PrintSessionStatus(session, reason.ToString()); - } - - void PrintSessionStatus(Session session, string reason, bool lastContact = false) - { - lock (session.DiagnosticsLock) - { - string item = String.Format("{0,9}:{1,20}:", reason, session.SessionDiagnostics.SessionName); - if (lastContact) - { - item += String.Format("Last Event:{0:HH:mm:ss}", - session.SessionDiagnostics.ClientLastContactTime.ToLocalTime()); - } - else - { - if (session.Identity != null) - { - item += String.Format(":{0,20}", session.Identity.DisplayName); - } - item += String.Format(":{0}", session.Id); - } - Console.WriteLine(item); - } - } - - private async void StatusThread() - { - while (server != null) - { - if (DateTime.UtcNow - lastEventTime > TimeSpan.FromMilliseconds(6000)) - { - IList sessions = server.CurrentInstance.SessionManager.GetSessions(); - // ReSharper disable once ForCanBeConvertedToForeach - for (int ii = 0; ii < sessions.Count; ii++) - { - Session session = sessions[ii]; - PrintSessionStatus(session, "-Status-", true); - } - lastEventTime = DateTime.UtcNow; - } - await Task.Delay(1000); - } - } - - } -} From 2d5396a2ae30f24b7713bd5f02df9629b6b02432 Mon Sep 17 00:00:00 2001 From: Alexander Wollbrink Date: Fri, 12 Jul 2024 11:46:43 +0200 Subject: [PATCH 06/13] remove AasxUaNetConsoleServer --- .../AasxUaNetConsoleServer.csproj | 23 - src/AasxUaNetConsoleServer/LICENSE.txt | 1475 ----------------- .../Net46AasxServerPlugin.Config.xml | 208 --- .../Opc.Ua.SampleServer.Config.xml | 207 --- src/AasxUaNetConsoleServer/Program.cs | 144 -- .../Properties/AssemblyInfo.cs | 36 - .../Properties/launchSettings.json | 8 - 7 files changed, 2101 deletions(-) delete mode 100644 src/AasxUaNetConsoleServer/AasxUaNetConsoleServer.csproj delete mode 100644 src/AasxUaNetConsoleServer/LICENSE.txt delete mode 100644 src/AasxUaNetConsoleServer/Net46AasxServerPlugin.Config.xml delete mode 100644 src/AasxUaNetConsoleServer/Opc.Ua.SampleServer.Config.xml delete mode 100644 src/AasxUaNetConsoleServer/Program.cs delete mode 100644 src/AasxUaNetConsoleServer/Properties/AssemblyInfo.cs delete mode 100644 src/AasxUaNetConsoleServer/Properties/launchSettings.json diff --git a/src/AasxUaNetConsoleServer/AasxUaNetConsoleServer.csproj b/src/AasxUaNetConsoleServer/AasxUaNetConsoleServer.csproj deleted file mode 100644 index b1d24f335..000000000 --- a/src/AasxUaNetConsoleServer/AasxUaNetConsoleServer.csproj +++ /dev/null @@ -1,23 +0,0 @@ - - - net6.0 - Exe - false - false - - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - - - - - diff --git a/src/AasxUaNetConsoleServer/LICENSE.txt b/src/AasxUaNetConsoleServer/LICENSE.txt deleted file mode 100644 index 75f36a4ff..000000000 --- a/src/AasxUaNetConsoleServer/LICENSE.txt +++ /dev/null @@ -1,1475 +0,0 @@ -Copyright (c) 2018-2023 Festo AG & Co. KG -, -author: Michael Hoffmeister - -Copyright (c) 2019-2021 PHOENIX CONTACT GmbH & Co. KG -, -author: Andreas Orzelski - -Copyright (c) 2019-2020 Fraunhofer IOSB-INA Lemgo, - eine rechtlich nicht selbstaendige Einrichtung der Fraunhofer-Gesellschaft - zur Foerderung der angewandten Forschung e.V. - -Copyright (c) 2020 Schneider Electric Automation GmbH -, -author: Marco Mendes - -Copyright (c) 2020 SICK AG - -Copyright (c) 2021 KEB Automation KG - -Copyright (c) 2021 Lenze SE -author: Jonas Grote, Denis Göllner, Sebastian Bischof - -The AASX Package Explorer is licensed under the Apache License 2.0 -(Apache-2.0, see below). - -The AASX Package Explorer is a sample application for demonstration of the -features of the Asset Administration Shell. -The implementation uses the concepts of the document "Details of the Asset -Administration Shell" published on www.plattform-i40.de which is licensed -under Creative Commons CC BY-ND 3.0 DE. - -When using eCl@ss or IEC CDD data, please check the corresponding license -conditions. - -------------------------------------------------------------------------------- - -The components below are used in AASX Package Explorer. -The related licenses are listed for information purposes only. -Some licenses may only apply to their related plugins. - -The browser functionality is licensed under the cefSharp license (see below). - -The Newtonsoft.JSON serialization is licensed under the MIT License -(MIT, see below). - -The QR code generation is licensed under the MIT license (MIT, see below). - -The Zxing.Net Dot Matrix Code (DMC) generation is licensed under -the Apache License 2.0 (Apache-2.0, see below). - -The Grapevine REST server framework is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The AutomationML.Engine is licensed under the MIT license (MIT, see below). - -The MQTT server and client is licensed under the MIT license (MIT, see below). - -The ClosedXML Excel reader/writer is licensed under the MIT license (MIT, -see below). - -The CountryFlag WPF control is licensed under the Code Project Open License -(CPOL, see below). - -The DocumentFormat.OpenXml SDK is licensed under the MIT license (MIT, -see below). - -The ExcelNumberFormat number parser is licensed under the MIT license (MIT, -see below). - -The FastMember reflection access is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The IdentityModel OpenID client is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The jose-jwt object signing and encryption is licensed under the -MIT license (MIT, see below). - -The ExcelDataReader is licensed under the MIT license (MIT, see below). - -Portions copyright (c) by OPC Foundation, Inc. and licensed under the -Reciprocal Community License (RCL, see below) - -The OPC UA Example Code of OPC UA Standard is licensed under the MIT license -(MIT, see below). - -The MSAGL (Microsoft Automatic Graph Layout) is licensed under the MIT license -(MIT, see below) - -Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license -(MIT, see below). - -The Magick.NET library is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed -under Apache License 2.0 (Apache-2.0, see below). - -------------------------------------------------------------------------------- - - -With respect to AASX Package Explorer -===================================== - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to cefSharp -======================== - -(https://raw.githubusercontent.com/cefsharp/CefSharp/master/LICENSE) - -Copyright © The CefSharp Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - * Neither the name of Google Inc. nor the name Chromium Embedded - Framework nor the name CefSharp nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -With respect to Newtonsoft.Json -=============================== - -(https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md) - -The MIT License (MIT) - -Copyright (c) 2007 James Newton-King - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to QRcoder -======================= - -(https://github.com/codebude/QRCoder/blob/master/LICENSE.txt) - -The MIT License (MIT) - -Copyright (c) 2013-2018 Raffael Herrmann - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to ZXing.Net -========================= -With respect to Grapevine -========================= -With respect to FastMember -========================== -With respect to IdentityModel -============================= - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to AutomationML.Engine -=================================== - -(https://raw.githubusercontent.com/AutomationML/AMLEngine2.1/master/license.txt) - -The MIT License (MIT) - -Copyright 2017 AutomationML e.V. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - -With respect to MQTTnet -======================= - -(https://github.com/chkr1011/MQTTnet/blob/master/LICENSE) - -MIT License - -MQTTnet Copyright (c) 2016-2019 Christian Kratky - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to ClosedXML -========================= - -(https://github.com/ClosedXML/ClosedXML/blob/develop/LICENSE) - -MIT License - -Copyright (c) 2016 ClosedXML - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to CountryFlag -=========================== - -(https://www.codeproject.com/Articles/190722/WPF-CountryFlag-Control) - -The Code Project Open License (CPOL) 1.02 - -Copyright © 2017 Meshack Musundi - -Preamble - -This License governs Your use of the Work. This License is intended to allow -developers to use the Source Code and Executable Files provided as part of -the Work in any application in any form. - -The main points subject to the terms of the License are: - - Source Code and Executable Files can be used in commercial applications; - Source Code and Executable Files can be redistributed; and - Source Code can be modified to create derivative works. - No claim of suitability, guarantee, or any warranty whatsoever is provided. - The software is provided "as-is". - The Article(s) accompanying the Work may not be distributed or republished - without the Author's consent - -This License is entered between You, the individual or other entity reading or -otherwise making use of the Work licensed pursuant to this License and the -individual or other entity which offers the Work under the terms of this -License ("Author"). - -License - -THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS -CODE PROJECT OPEN LICENSE ("LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT -AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED -UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. - -BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HEREIN, YOU ACCEPT AND AGREE -TO BE BOUND BY THE TERMS OF THIS LICENSE. THE AUTHOR GRANTS YOU THE RIGHTS -CONTAINED HEREIN IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND -CONDITIONS. IF YOU DO NOT AGREE TO ACCEPT AND BE BOUND BY THE TERMS OF THIS -LICENSE, YOU CANNOT MAKE ANY USE OF THE WORK. - -Definitions. - "Articles" means, collectively, all articles written by Author which -describes how the Source Code and Executable Files for the Work may -be used by a user. - "Author" means the individual or entity that offers the Work under -the terms of this License. - "Derivative Work" means a work based upon the Work or upon the Work -and other pre-existing works. - "Executable Files" refer to the executables, binary files, -configuration and any required data files included in the Work. - "Publisher" means the provider of the website, magazine, CD-ROM, -DVD or other medium from or by which the Work is obtained by You. - "Source Code" refers to the collection of source code and -configuration files used to create the Executable Files. - "Standard Version" refers to such a Work if it has not been modified, -or has been modified in accordance with the consent of the Author, -such consent being in the full discretion of the Author. - "Work" refers to the collection of files distributed by the Publisher, -including the Source Code, Executable Files, binaries, data files, -documentation, whitepapers and the Articles. - "You" is you, an individual or entity wishing to use the Work and -exercise your rights under this License. - -Fair Use/Fair Use Rights. Nothing in this License is intended to reduce, -limit, or restrict any rights arising from fair use, fair dealing, -first sale or other limitations on the exclusive rights of the -copyright owner under copyright law or other applicable laws. - -License Grant. Subject to the terms and conditions of this License, the -Author hereby grants You a worldwide, royalty-free, non-exclusive, -perpetual (for the duration of the applicable copyright) license -to exercise the rights in the Work as stated below: - You may use the standard version of the Source Code or Executable -Files in Your own applications. - You may apply bug fixes, portability fixes and other modifications -obtained from the Public Domain or from the Author. A Work modified -in such a way shall still be considered the standard version and will -be subject to this License. - You may otherwise modify Your copy of this Work (excluding the Articles) -in any way to create a Derivative Work, provided that You insert a prominent -notice in each changed file stating how, when and where You changed that file. - You may distribute the standard version of the Executable Files and Source -Code or Derivative Work in aggregate with other (possibly commercial) -programs as part of a larger (possibly commercial) software distribution. - The Articles discussing the Work published in any form by the author may -not be distributed or republished without the Author's consent. The author -retains copyright to any such Articles. You may use the Executable Files and -Source Code pursuant to this License but you may not repost or republish or -otherwise distribute or make available the Articles, without the prior written -consent of the Author. - -Any subroutines or modules supplied by You and linked into the Source Code -or Executable Files of this Work shall not be considered part of this Work -and will not be subject to the terms of this License. - -Patent License. Subject to the terms and conditions of this License, each -Author hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, -royalty-free, irrevocable (except as stated in this section) patent license -to make, have made, use, import, and otherwise transfer the Work. - -Restrictions. The license granted in Section 3 above is expressly made subject -to and limited by the following restrictions: - You agree not to remove any of the original copyright, patent, trademark, -and attribution notices and associated disclaimers that may appear in the -Source Code or Executable Files. - You agree not to advertise or in any way imply that this Work is a product -of Your own. - The name of the Author may not be used to endorse or promote products -derived from the Work without the prior written consent of the Author. - You agree not to sell, lease, or rent any part of the Work. This does -not restrict you from including the Work or any part of the Work inside -a larger software distribution that itself is being sold. The Work by itself, -though, cannot be sold, leased or rented. - You may distribute the Executable Files and Source Code only under the terms -of this License, and You must include a copy of, or the Uniform Resource -Identifier for, this License with every copy of the Executable Files or -Source Code You distribute and ensure that anyone receiving such Executable -Files and Source Code agrees that the terms of this License apply to such -Executable Files and/or Source Code. You may not offer or impose any terms -on the Work that alter or restrict the terms of this License or the -recipients' exercise of the rights granted hereunder. You may not sublicense -the Work. You must keep intact all notices that refer to this License and to -the disclaimer of warranties. You may not distribute the Executable Files or -Source Code with any technological measures that control access or use of the -Work in a manner inconsistent with the terms of this License. - You agree not to use the Work for illegal, immoral or improper -purposes, or on pages containing illegal, immoral or improper material. -The Work is subject to applicable export laws. You agree to comply with all -such laws and regulations that may apply to the Work after Your receipt of -the Work. - -Representations, Warranties and Disclaimer. THIS WORK IS PROVIDED "AS IS", -"WHERE IS" AND "AS AVAILABLE", WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OR -CONDITIONS OR GUARANTEES. YOU, THE USER, ASSUME ALL RISK IN ITS USE, -INCLUDING COPYRIGHT INFRINGEMENT, PATENT INFRINGEMENT, SUITABILITY, ETC. -AUTHOR EXPRESSLY DISCLAIMS ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES -OR CONDITIONS, INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS -OF MERCHANTABILITY, MERCHANTABLE QUALITY OR FITNESS FOR A PARTICULAR -PURPOSE, OR ANY WARRANTY OF TITLE OR NON-INFRINGEMENT, OR THAT THE WORK -(OR ANY PORTION THEREOF) IS CORRECT, USEFUL, BUG-FREE OR FREE OF VIRUSES. -YOU MUST PASS THIS DISCLAIMER ON WHENEVER YOU DISTRIBUTE THE WORK OR DERIVATIVE -WORKS. - -Indemnity. You agree to defend, indemnify and hold harmless the Author and the -Publisher from and against any claims, suits, losses, damages, liabilities, -costs, and expenses (including reasonable legal or attorneys’ fees) -resulting from or relating to any use of the Work by You. - -Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, -IN NO EVENT WILL THE AUTHOR OR THE PUBLISHER BE LIABLE TO YOU ON ANY LEGAL -THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY -DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK OR OTHERWISE, -EVEN IF THE AUTHOR OR THE PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY -OF SUCH DAMAGES. - -Termination. - This License and the rights granted hereunder will terminate -automatically upon any breach by You of any term of this License. -Individuals or entities who have received Derivative Works from You under -this License, however, will not have their licenses terminated provided such -individuals or entities remain in full compliance with those licenses. -Sections 1, 2, 6, 7, 8, 9, 10 and 11 will survive any termination of -this License. - If You bring a copyright, trademark, patent or any other infringement -claim against any contributor over infringements You claim are made by the -Work, your License from such contributor to the Work ends automatically. - Subject to the above terms and conditions, this License is perpetual -(for the duration of the applicable copyright in the Work). -Notwithstanding the above, the Author reserves the right to release the Work -under different license terms or to stop distributing the Work at any time; -provided, however that any such election will not serve to withdraw this -License (or any other license that has been, or is required to be, -granted under the terms of this License), and this License will continue -in full force and effect unless terminated as stated above. - -Publisher. The parties hereby confirm that the Publisher shall not, under -any circumstances, be responsible for and shall not have any liability -in respect of the subject matter of this License. The Publisher makes no -warranty whatsoever in connection with the Work and shall not be liable -to You or any party on any legal theory for any damages whatsoever, including -without limitation any general, special, incidental or consequential damages -arising in connection to this license. The Publisher reserves the right to -cease making the Work available to You at any time without notice - -Miscellaneous - This License shall be governed by the laws of the location of the head -office of the Author or if the Author is an individual, the laws of -location of the principal place of residence of the Author. - If any provision of this License is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of the -remainder of the terms of this License, and without further action by the -parties to this License, such provision shall be reformed to the minimum -extent necessary to make such provision valid and enforceable. - No term or provision of this License shall be deemed waived and no -breach consented to unless such waiver or consent shall be in writing -and signed by the party to be charged with such waiver or consent. - This License constitutes the entire agreement between the parties -with respect to the Work licensed herein. There are no understandings, -agreements or representations with respect to the Work not specified herein. -The Author shall not be bound by any additional provisions that may appear -in any communication from You. This License may not be modified without -the mutual written agreement of the Author and You. - - -With respect to DocumentFormat.OpenXml -====================================== - -(https://github.com/OfficeDev/Open-XML-SDK/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to ExcelNumberFormat -================================= - -(https://github.com/andersnm/ExcelNumberFormat/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2017 andersnm - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to jose-jwt -======================== - -(https://github.com/dvsekhvalnov/jose-jwt/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014-2019 dvsekhvalnov - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With resepect to ExcelDataReader -================================ - -(https://github.com/ExcelDataReader/ExcelDataReader/blob/develop/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014 ExcelDataReader - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepect to OPC UA Example Code -==================================== - - * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved. - * - * OPC Foundation MIT License 1.00 - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * The complete license agreement can be found here: - * http://opcfoundation.org/License/MIT/1.00/ - - -With respect to OPC Foundation -============================== - -RCL License -Reciprocal Community License 1.00 (RCL1.00) -Version 1.00, June 24, 2009 -Copyright (C) 2008,2009 OPC Foundation, Inc., All Rights Reserved. - -https://opcfoundation.org/license/rcl.html - -Remark: PHOENIX CONTACT GmbH & Co. KG and Festo SE & Co. KG are members -of OPC foundation. - -With respect to MSAGL (Microsoft Automatic Graph Layout) -======================================================== -(see: https://github.com/microsoft/automatic-graph-layout/blob/master/LICENSE) - -Microsoft Automatic Graph Layout, MSAGL - -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -""Software""), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With respect to Glob (https://www.nuget.org/packages/Glob/) -=========================================================== -(see: https://raw.githubusercontent.com/kthompson/glob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2013-2019 Kevin Thompson - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to Magick.NET -========================== - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -With respect to SSharp.NET library -================================== - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/src/AasxUaNetConsoleServer/Net46AasxServerPlugin.Config.xml b/src/AasxUaNetConsoleServer/Net46AasxServerPlugin.Config.xml deleted file mode 100644 index 096d2c34c..000000000 --- a/src/AasxUaNetConsoleServer/Net46AasxServerPlugin.Config.xml +++ /dev/null @@ -1,208 +0,0 @@ - - - - UA Core Sample Server - urn:localhost:OPCFoundation:CoreSampleServer - http://opcfoundation.org/UA/CoreSampleServer - Server_0 - - - - - - X509Store - CurrentUser\My - CN=UA Core Sample Server, C=US, S=Arizona, O=OPC Foundation, DC=localhost - - - - - Directory - %LocalApplicationData%/OPC Foundation/pki/issuer - - - - - Directory - %LocalApplicationData%/OPC Foundation/pki/trusted - - - - - Directory - %LocalApplicationData%/OPC Foundation/pki/rejected - - - - true - - - - - - - 600000 - 1048576 - 4194304 - 65535 - 4194304 - 65535 - 300000 - 3600000 - - - - - opc.tcp://localhost:51210/UA/SampleServer - https://localhost:51212/UA/SampleServer/ - - - - - - - - SignAndEncrypt_3 - http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256 - - - - None_1 - http://opcfoundation.org/UA/SecurityPolicy#None - - - Sign_2 - - - - SignAndEncrypt_3 - - - - - 5 - 100 - 2000 - - - - Anonymous_0 - http://opcfoundation.org/UA/SecurityPolicy#None - - - UserName_1 - - - Certificate_2 - - - - false - 100 - 10000 - 3600000 - 10 - 10 - 100 - 600000 - 100 - 3600000 - 50 - 3600000 - 100 - 100 - 1000 - 1000 - - - 0 - Opc.Ua.Server.nodes.xml - - 20 - 100 - 10000 - 10000 - - - - Standard UA Server Profile - Data Access Server Facet - Method Server Facet - - 5 - - DA - - - PFX - PEM - - 0 - false - - - - - - - - - UInt32 - 100 - UInt32 - - - Double - 100 - Double - - - - - - - - %LocalApplicationData%/Logs/Opc.Ua.CoreSampleServer.log.txt - true - - - - - - - - - - - - - - - - true - - \ No newline at end of file diff --git a/src/AasxUaNetConsoleServer/Opc.Ua.SampleServer.Config.xml b/src/AasxUaNetConsoleServer/Opc.Ua.SampleServer.Config.xml deleted file mode 100644 index b60a351b1..000000000 --- a/src/AasxUaNetConsoleServer/Opc.Ua.SampleServer.Config.xml +++ /dev/null @@ -1,207 +0,0 @@ - - - UA Core Sample Server - urn:localhost:OPCFoundation:CoreSampleServer - http://opcfoundation.org/UA/CoreSampleServer - Server_0 - - - - - - X509Store - CurrentUser\My - CN=UA Core Sample Server, C=US, S=Arizona, O=OPC Foundation, DC=localhost - - - - - Directory - %LocalApplicationData%/OPC Foundation/pki/issuer - - - - - Directory - %LocalApplicationData%/OPC Foundation/pki/trusted - - - - - Directory - %LocalApplicationData%/OPC Foundation/pki/rejected - - - - false - - - - - - - 600000 - 1048576 - 4194304 - 65535 - 4194304 - 65535 - 300000 - 3600000 - - - - - opc.tcp://localhost:51210/UA/SampleServer - https://localhost:51212/UA/SampleServer/ - - - - - - - - SignAndEncrypt_3 - http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256 - - - - None_1 - http://opcfoundation.org/UA/SecurityPolicy#None - - - Sign_2 - - - - SignAndEncrypt_3 - - - - - 5 - 100 - 2000 - - - - Anonymous_0 - http://opcfoundation.org/UA/SecurityPolicy#None - - - UserName_1 - - - Certificate_2 - - - - false - 100 - 10000 - 3600000 - 10 - 10 - 100 - 600000 - 100 - 3600000 - 50 - 3600000 - 100 - 100 - 1000 - 1000 - - - 0 - Opc.Ua.Server.nodes.xml - - 20 - 100 - 10000 - 10000 - - - - Standard UA Server Profile - Data Access Server Facet - Method Server Facet - - 5 - - DA - - - PFX - PEM - - 0 - false - - - - - - - - - UInt32 - 100 - UInt32 - - - Double - 100 - Double - - - - - - - - %LocalApplicationData%/Logs/Opc.Ua.CoreSampleServer.log.txt - true - - - - - - - - - - - - - - - - true - - \ No newline at end of file diff --git a/src/AasxUaNetConsoleServer/Program.cs b/src/AasxUaNetConsoleServer/Program.cs deleted file mode 100644 index 052b5a1f3..000000000 --- a/src/AasxUaNetConsoleServer/Program.cs +++ /dev/null @@ -1,144 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo AG & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -// TODO (MIHO, 2020-08-03): check SOURCE - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using AasOpcUaServer; -using AasxIntegrationBase; -using AasxUaNetServer; -using AdminShellNS; -using Opc.Ua; -using Opc.Ua.Configuration; -using Opc.Ua.Server; - -namespace Net46ConsoleServer -{ - // ReSharper disable once ClassNeverInstantiated.Global - class Program - { - static void Main(string[] args) - { - // start - Console.Error.WriteLine( - "AAS OPC UA Server. (c) 2019 Michael Hoffmeister, Festo AG & Co. KG. See LICENSE.TXT."); - - // arguments - var options = new AasOpcUaServer.AasxUaServerOptions(); - options.ParseArgs(args); - - // load aasx - if (options.AasxToLoad == null) - { - Console.Error.WriteLine("No .aasx-file to load given. Exiting!"); - return; - } - Console.Error.WriteLine($"loading: {options.AasxToLoad} .."); - var env = new AdminShellPackageEnv(options.AasxToLoad); - - // ReSharper disable HeuristicUnreachableCode - // ReSharper disable once ConditionIsAlwaysTrueOrFalse - if (env == null) - { - Console.Error.WriteLine($"Cannot open {options.AasxToLoad}. Aborting.."); - } - - // configure UA here a little bit - ApplicationInstance.MessageDlg = new ApplicationMessageDlg(); - - // logger - var logger = new LogInstance(); - - // start - Console.WriteLine("Starting server ..."); - Console.WriteLine("Press 'x' to exit."); - UaServerWrapper server = new UaServerWrapper(_stopTimeout: 0, _aasxEnv: env, logger: logger, _serverOptions: options); - server.Run(); - - // loop - while (true) - { - StoredPrint sp; - while ((sp = logger.PopLastShortTermPrint()) != null) - Console.WriteLine(sp.ToString()); - - Thread.Sleep(10); - - if (Console.KeyAvailable) - { - var cki = Console.ReadKey(true); - if (cki.Key == ConsoleKey.X) - { - Console.WriteLine("Stopping initiated ..."); - break; - } - } - } - - // stop - server.Stop(); - } - } - - public class ApplicationMessageDlg : IApplicationMessageDlg - { - private string message = string.Empty; - private bool ask = false; - - public override void Message(string text, bool ask = false) - { - this.message = text; - this.ask = ask; - } - - public override async Task ShowAsync() - { - if (ask) - { - message += " (y/n, default y): "; - Console.Write(message); - } - else - { - Console.WriteLine(message); - } - if (ask) - { - try - { - ConsoleKeyInfo result = Console.ReadKey(); - Console.WriteLine(); - return await Task.FromResult((result.KeyChar == 'y') || (result.KeyChar == 'Y') - || (result.KeyChar == '\r')); - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); - } - } - return await Task.FromResult(true); - } - } - - // ReSharper disable once UnusedType.Global - public enum ExitCode - { - Ok = 0, - ErrorServerNotStarted = 0x80, - ErrorServerRunning = 0x81, - ErrorServerException = 0x82, - ErrorInvalidCommandLine = 0x100 - }; - -} diff --git a/src/AasxUaNetConsoleServer/Properties/AssemblyInfo.cs b/src/AasxUaNetConsoleServer/Properties/AssemblyInfo.cs deleted file mode 100644 index 3e2a26c49..000000000 --- a/src/AasxUaNetConsoleServer/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die einer Assembly zugeordnet sind. -[assembly: AssemblyTitle("AasxUaNetConsoleServer")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("AasxUaNetConsoleServer")] -[assembly: AssemblyCopyright("Copyright © 2020")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly -// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von -// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. -[assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird -[assembly: Guid("232852c2-358b-4577-9d29-1e48ed75c342")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, -// übernehmen, indem Sie "*" eingeben: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/AasxUaNetConsoleServer/Properties/launchSettings.json b/src/AasxUaNetConsoleServer/Properties/launchSettings.json deleted file mode 100644 index 7393c7127..000000000 --- a/src/AasxUaNetConsoleServer/Properties/launchSettings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "profiles": { - "AasxUaNetConsoleServer": { - "commandName": "Project", - "commandLineArgs": "D:\\Code\\aasx-server\\src\\AasxServerBlazor\\erich-repo.aasx" - } - } -} \ No newline at end of file From 74541b6df24aab0a48ac75979dff6b5134381d1a Mon Sep 17 00:00:00 2001 From: Alexander Wollbrink Date: Fri, 12 Jul 2024 11:48:22 +0200 Subject: [PATCH 07/13] remove AasxRestConsoleServer --- src/AasxPackageExplorer.sln | 161 +- .../AasxRestConsoleServer.csproj | 13 - src/AasxRestConsoleServer/LICENSE.txt | 1475 ----------------- src/AasxRestConsoleServer/Program.cs | 70 - .../Properties/AssemblyInfo.cs | 36 - 5 files changed, 2 insertions(+), 1753 deletions(-) delete mode 100644 src/AasxRestConsoleServer/AasxRestConsoleServer.csproj delete mode 100644 src/AasxRestConsoleServer/LICENSE.txt delete mode 100644 src/AasxRestConsoleServer/Program.cs delete mode 100644 src/AasxRestConsoleServer/Properties/AssemblyInfo.cs diff --git a/src/AasxPackageExplorer.sln b/src/AasxPackageExplorer.sln index 286b0978e..e321a4197 100644 --- a/src/AasxPackageExplorer.sln +++ b/src/AasxPackageExplorer.sln @@ -46,12 +46,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginTechnicalData", " EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{9264D68F-5269-420F-A486-6B8F39BEEB8B}" ProjectSection(SolutionItems) = preProject - Notes_V3.md = Notes_V3.md - README-packages.md = README-packages.md ..\CHANGELOG.md = ..\CHANGELOG.md ..\CODE_OF_CONDUCT.md = ..\CODE_OF_CONDUCT.md ..\CONTRIBUTING.md = ..\CONTRIBUTING.md ..\CONTRIBUTORS.md = ..\CONTRIBUTORS.md + Notes_V3.md = Notes_V3.md + README-packages.md = README-packages.md ..\README.md = ..\README.md EndProjectSection EndProject @@ -85,14 +85,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WpfMtpVisuViewer", "WpfMtpV EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "FunctionalUiLibs", "FunctionalUiLibs", "{C1752DB5-0157-4666-A25D-2666089457BB}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxUaNetServer", "AasxUaNetServer\AasxUaNetServer.csproj", "{C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginUaNetServer", "AasxPluginUaNetServer\AasxPluginUaNetServer.csproj", "{32EEDE14-8622-42E6-81AE-33941B7A6EFC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginUaNetClient", "AasxPluginUaNetClient\AasxPluginUaNetClient.csproj", "{9EB71E8B-EC41-4054-BAB4-F419B4D13A36}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxUaNetConsoleServer", "AasxUaNetConsoleServer\AasxUaNetConsoleServer.csproj", "{232852C2-358B-4577-9D29-1E48ED75C342}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UserSpecific", "UserSpecific", "{4FD813E9-EC97-4E85-BAFC-5280BC07C302}" ProjectSection(SolutionItems) = preProject MIHO.NUnit.runsettings = MIHO.NUnit.runsettings @@ -982,126 +974,6 @@ Global {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|x64.ActiveCfg = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|x64.Build.0 = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|x86.ActiveCfg = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Debug|x86.Build.0 = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugSlow|x64.ActiveCfg = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugSlow|x64.Build.0 = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugSlow|x86.ActiveCfg = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugSlow|x86.Build.0 = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|Any CPU.Build.0 = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|x64.ActiveCfg = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|x64.Build.0 = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|x86.ActiveCfg = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.Release|x86.Build.0 = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|x64.ActiveCfg = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|x64.Build.0 = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|x86.ActiveCfg = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Debug|x86.Build.0 = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugSlow|x64.ActiveCfg = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugSlow|x64.Build.0 = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugSlow|x86.ActiveCfg = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugSlow|x86.Build.0 = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|Any CPU.Build.0 = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|x64.ActiveCfg = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|x64.Build.0 = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|x86.ActiveCfg = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.Release|x86.Build.0 = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {32EEDE14-8622-42E6-81AE-33941B7A6EFC}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|x64.ActiveCfg = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|x64.Build.0 = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|x86.ActiveCfg = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Debug|x86.Build.0 = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugSlow|x64.ActiveCfg = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugSlow|x64.Build.0 = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugSlow|x86.ActiveCfg = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugSlow|x86.Build.0 = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|Any CPU.Build.0 = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|x64.ActiveCfg = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|x64.Build.0 = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|x86.ActiveCfg = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.Release|x86.Build.0 = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|Any CPU.Build.0 = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|x64.ActiveCfg = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|x64.Build.0 = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|x86.ActiveCfg = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Debug|x86.Build.0 = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugSlow|x64.ActiveCfg = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugSlow|x64.Build.0 = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugSlow|x86.ActiveCfg = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugSlow|x86.Build.0 = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Release|Any CPU.ActiveCfg = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Release|Any CPU.Build.0 = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Release|x64.ActiveCfg = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Release|x64.Build.0 = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Release|x86.ActiveCfg = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.Release|x86.Build.0 = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {232852C2-358B-4577-9D29-1E48ED75C342}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|Any CPU.Build.0 = Debug|Any CPU {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -1702,30 +1574,6 @@ Global {AB60370B-DC87-414D-8A6C-7B095F940A1B}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU {AB60370B-DC87-414D-8A6C-7B095F940A1B}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU {AB60370B-DC87-414D-8A6C-7B095F940A1B}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Debug|Any CPU.ActiveCfg = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Debug|x64.ActiveCfg = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Debug|x86.ActiveCfg = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Debug|x86.Build.0 = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugSlow|Any CPU.ActiveCfg = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugSlow|x64.ActiveCfg = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugSlow|x86.ActiveCfg = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugWithoutCEF|Any CPU.Build.0 = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugWithoutCEF|x64.ActiveCfg = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugWithoutCEF|x64.Build.0 = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugWithoutCEF|x86.ActiveCfg = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.DebugWithoutCEF|x86.Build.0 = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Release|Any CPU.ActiveCfg = Release|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Release|Any CPU.Build.0 = Release|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Release|x64.ActiveCfg = Release|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Release|x86.ActiveCfg = Release|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Release|x86.Build.0 = Release|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.ReleaseWithoutCEF|Any CPU.Build.0 = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.ReleaseWithoutCEF|x64.ActiveCfg = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.ReleaseWithoutCEF|x64.Build.0 = Debug|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.ReleaseWithoutCEF|x86.ActiveCfg = Release|x86 - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.ReleaseWithoutCEF|x86.Build.0 = Release|x86 {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.Debug|Any CPU.Build.0 = Debug|Any CPU {4EB64F40-1A01-46BB-BEED-D1A75313C7F8}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -1968,10 +1816,6 @@ Global {F6CF3948-C67A-40FC-812A-3733F673EA21} = {C1752DB5-0157-4666-A25D-2666089457BB} {7A612803-BAE2-4FED-BBCE-56079EDB8594} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C} = {98C89299-C429-4F0B-9938-4B7775943393} - {C1E3F0D9-2BEA-4668-AFF4-454FDF527A58} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {32EEDE14-8622-42E6-81AE-33941B7A6EFC} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {9EB71E8B-EC41-4054-BAB4-F419B4D13A36} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {232852C2-358B-4577-9D29-1E48ED75C342} = {1A282279-9375-4714-96B6-89A00985C9DC} {4FD813E9-EC97-4E85-BAFC-5280BC07C302} = {9264D68F-5269-420F-A486-6B8F39BEEB8B} {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC} = {98C89299-C429-4F0B-9938-4B7775943393} {8D09D103-1B97-4D54-BAA9-841B2F93FF36} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} @@ -1992,7 +1836,6 @@ Global {00F5EA49-F66D-4104-A621-AF668DD58C05} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} {A713E962-38FB-4FD0-9687-30F530E95E91} = {98C89299-C429-4F0B-9938-4B7775943393} {AB60370B-DC87-414D-8A6C-7B095F940A1B} = {98C89299-C429-4F0B-9938-4B7775943393} - {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34} = {5BA4D327-1907-4F5A-BC90-5EA939497BFC} {4EB64F40-1A01-46BB-BEED-D1A75313C7F8} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} {BE68E42C-28CB-4298-9F34-A18AF92FC4DE} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} {6A1F717C-8F43-4260-98A6-49345F983EFC} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} diff --git a/src/AasxRestConsoleServer/AasxRestConsoleServer.csproj b/src/AasxRestConsoleServer/AasxRestConsoleServer.csproj deleted file mode 100644 index 7f375ae67..000000000 --- a/src/AasxRestConsoleServer/AasxRestConsoleServer.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - net6.0 - Exe - false - false - - - - PreserveNewest - - - diff --git a/src/AasxRestConsoleServer/LICENSE.txt b/src/AasxRestConsoleServer/LICENSE.txt deleted file mode 100644 index 75f36a4ff..000000000 --- a/src/AasxRestConsoleServer/LICENSE.txt +++ /dev/null @@ -1,1475 +0,0 @@ -Copyright (c) 2018-2023 Festo AG & Co. KG -, -author: Michael Hoffmeister - -Copyright (c) 2019-2021 PHOENIX CONTACT GmbH & Co. KG -, -author: Andreas Orzelski - -Copyright (c) 2019-2020 Fraunhofer IOSB-INA Lemgo, - eine rechtlich nicht selbstaendige Einrichtung der Fraunhofer-Gesellschaft - zur Foerderung der angewandten Forschung e.V. - -Copyright (c) 2020 Schneider Electric Automation GmbH -, -author: Marco Mendes - -Copyright (c) 2020 SICK AG - -Copyright (c) 2021 KEB Automation KG - -Copyright (c) 2021 Lenze SE -author: Jonas Grote, Denis Göllner, Sebastian Bischof - -The AASX Package Explorer is licensed under the Apache License 2.0 -(Apache-2.0, see below). - -The AASX Package Explorer is a sample application for demonstration of the -features of the Asset Administration Shell. -The implementation uses the concepts of the document "Details of the Asset -Administration Shell" published on www.plattform-i40.de which is licensed -under Creative Commons CC BY-ND 3.0 DE. - -When using eCl@ss or IEC CDD data, please check the corresponding license -conditions. - -------------------------------------------------------------------------------- - -The components below are used in AASX Package Explorer. -The related licenses are listed for information purposes only. -Some licenses may only apply to their related plugins. - -The browser functionality is licensed under the cefSharp license (see below). - -The Newtonsoft.JSON serialization is licensed under the MIT License -(MIT, see below). - -The QR code generation is licensed under the MIT license (MIT, see below). - -The Zxing.Net Dot Matrix Code (DMC) generation is licensed under -the Apache License 2.0 (Apache-2.0, see below). - -The Grapevine REST server framework is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The AutomationML.Engine is licensed under the MIT license (MIT, see below). - -The MQTT server and client is licensed under the MIT license (MIT, see below). - -The ClosedXML Excel reader/writer is licensed under the MIT license (MIT, -see below). - -The CountryFlag WPF control is licensed under the Code Project Open License -(CPOL, see below). - -The DocumentFormat.OpenXml SDK is licensed under the MIT license (MIT, -see below). - -The ExcelNumberFormat number parser is licensed under the MIT license (MIT, -see below). - -The FastMember reflection access is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The IdentityModel OpenID client is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The jose-jwt object signing and encryption is licensed under the -MIT license (MIT, see below). - -The ExcelDataReader is licensed under the MIT license (MIT, see below). - -Portions copyright (c) by OPC Foundation, Inc. and licensed under the -Reciprocal Community License (RCL, see below) - -The OPC UA Example Code of OPC UA Standard is licensed under the MIT license -(MIT, see below). - -The MSAGL (Microsoft Automatic Graph Layout) is licensed under the MIT license -(MIT, see below) - -Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license -(MIT, see below). - -The Magick.NET library is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed -under Apache License 2.0 (Apache-2.0, see below). - -------------------------------------------------------------------------------- - - -With respect to AASX Package Explorer -===================================== - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to cefSharp -======================== - -(https://raw.githubusercontent.com/cefsharp/CefSharp/master/LICENSE) - -Copyright © The CefSharp Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - * Neither the name of Google Inc. nor the name Chromium Embedded - Framework nor the name CefSharp nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -With respect to Newtonsoft.Json -=============================== - -(https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md) - -The MIT License (MIT) - -Copyright (c) 2007 James Newton-King - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to QRcoder -======================= - -(https://github.com/codebude/QRCoder/blob/master/LICENSE.txt) - -The MIT License (MIT) - -Copyright (c) 2013-2018 Raffael Herrmann - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to ZXing.Net -========================= -With respect to Grapevine -========================= -With respect to FastMember -========================== -With respect to IdentityModel -============================= - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to AutomationML.Engine -=================================== - -(https://raw.githubusercontent.com/AutomationML/AMLEngine2.1/master/license.txt) - -The MIT License (MIT) - -Copyright 2017 AutomationML e.V. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - -With respect to MQTTnet -======================= - -(https://github.com/chkr1011/MQTTnet/blob/master/LICENSE) - -MIT License - -MQTTnet Copyright (c) 2016-2019 Christian Kratky - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to ClosedXML -========================= - -(https://github.com/ClosedXML/ClosedXML/blob/develop/LICENSE) - -MIT License - -Copyright (c) 2016 ClosedXML - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to CountryFlag -=========================== - -(https://www.codeproject.com/Articles/190722/WPF-CountryFlag-Control) - -The Code Project Open License (CPOL) 1.02 - -Copyright © 2017 Meshack Musundi - -Preamble - -This License governs Your use of the Work. This License is intended to allow -developers to use the Source Code and Executable Files provided as part of -the Work in any application in any form. - -The main points subject to the terms of the License are: - - Source Code and Executable Files can be used in commercial applications; - Source Code and Executable Files can be redistributed; and - Source Code can be modified to create derivative works. - No claim of suitability, guarantee, or any warranty whatsoever is provided. - The software is provided "as-is". - The Article(s) accompanying the Work may not be distributed or republished - without the Author's consent - -This License is entered between You, the individual or other entity reading or -otherwise making use of the Work licensed pursuant to this License and the -individual or other entity which offers the Work under the terms of this -License ("Author"). - -License - -THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS -CODE PROJECT OPEN LICENSE ("LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT -AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED -UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. - -BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HEREIN, YOU ACCEPT AND AGREE -TO BE BOUND BY THE TERMS OF THIS LICENSE. THE AUTHOR GRANTS YOU THE RIGHTS -CONTAINED HEREIN IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND -CONDITIONS. IF YOU DO NOT AGREE TO ACCEPT AND BE BOUND BY THE TERMS OF THIS -LICENSE, YOU CANNOT MAKE ANY USE OF THE WORK. - -Definitions. - "Articles" means, collectively, all articles written by Author which -describes how the Source Code and Executable Files for the Work may -be used by a user. - "Author" means the individual or entity that offers the Work under -the terms of this License. - "Derivative Work" means a work based upon the Work or upon the Work -and other pre-existing works. - "Executable Files" refer to the executables, binary files, -configuration and any required data files included in the Work. - "Publisher" means the provider of the website, magazine, CD-ROM, -DVD or other medium from or by which the Work is obtained by You. - "Source Code" refers to the collection of source code and -configuration files used to create the Executable Files. - "Standard Version" refers to such a Work if it has not been modified, -or has been modified in accordance with the consent of the Author, -such consent being in the full discretion of the Author. - "Work" refers to the collection of files distributed by the Publisher, -including the Source Code, Executable Files, binaries, data files, -documentation, whitepapers and the Articles. - "You" is you, an individual or entity wishing to use the Work and -exercise your rights under this License. - -Fair Use/Fair Use Rights. Nothing in this License is intended to reduce, -limit, or restrict any rights arising from fair use, fair dealing, -first sale or other limitations on the exclusive rights of the -copyright owner under copyright law or other applicable laws. - -License Grant. Subject to the terms and conditions of this License, the -Author hereby grants You a worldwide, royalty-free, non-exclusive, -perpetual (for the duration of the applicable copyright) license -to exercise the rights in the Work as stated below: - You may use the standard version of the Source Code or Executable -Files in Your own applications. - You may apply bug fixes, portability fixes and other modifications -obtained from the Public Domain or from the Author. A Work modified -in such a way shall still be considered the standard version and will -be subject to this License. - You may otherwise modify Your copy of this Work (excluding the Articles) -in any way to create a Derivative Work, provided that You insert a prominent -notice in each changed file stating how, when and where You changed that file. - You may distribute the standard version of the Executable Files and Source -Code or Derivative Work in aggregate with other (possibly commercial) -programs as part of a larger (possibly commercial) software distribution. - The Articles discussing the Work published in any form by the author may -not be distributed or republished without the Author's consent. The author -retains copyright to any such Articles. You may use the Executable Files and -Source Code pursuant to this License but you may not repost or republish or -otherwise distribute or make available the Articles, without the prior written -consent of the Author. - -Any subroutines or modules supplied by You and linked into the Source Code -or Executable Files of this Work shall not be considered part of this Work -and will not be subject to the terms of this License. - -Patent License. Subject to the terms and conditions of this License, each -Author hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, -royalty-free, irrevocable (except as stated in this section) patent license -to make, have made, use, import, and otherwise transfer the Work. - -Restrictions. The license granted in Section 3 above is expressly made subject -to and limited by the following restrictions: - You agree not to remove any of the original copyright, patent, trademark, -and attribution notices and associated disclaimers that may appear in the -Source Code or Executable Files. - You agree not to advertise or in any way imply that this Work is a product -of Your own. - The name of the Author may not be used to endorse or promote products -derived from the Work without the prior written consent of the Author. - You agree not to sell, lease, or rent any part of the Work. This does -not restrict you from including the Work or any part of the Work inside -a larger software distribution that itself is being sold. The Work by itself, -though, cannot be sold, leased or rented. - You may distribute the Executable Files and Source Code only under the terms -of this License, and You must include a copy of, or the Uniform Resource -Identifier for, this License with every copy of the Executable Files or -Source Code You distribute and ensure that anyone receiving such Executable -Files and Source Code agrees that the terms of this License apply to such -Executable Files and/or Source Code. You may not offer or impose any terms -on the Work that alter or restrict the terms of this License or the -recipients' exercise of the rights granted hereunder. You may not sublicense -the Work. You must keep intact all notices that refer to this License and to -the disclaimer of warranties. You may not distribute the Executable Files or -Source Code with any technological measures that control access or use of the -Work in a manner inconsistent with the terms of this License. - You agree not to use the Work for illegal, immoral or improper -purposes, or on pages containing illegal, immoral or improper material. -The Work is subject to applicable export laws. You agree to comply with all -such laws and regulations that may apply to the Work after Your receipt of -the Work. - -Representations, Warranties and Disclaimer. THIS WORK IS PROVIDED "AS IS", -"WHERE IS" AND "AS AVAILABLE", WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OR -CONDITIONS OR GUARANTEES. YOU, THE USER, ASSUME ALL RISK IN ITS USE, -INCLUDING COPYRIGHT INFRINGEMENT, PATENT INFRINGEMENT, SUITABILITY, ETC. -AUTHOR EXPRESSLY DISCLAIMS ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES -OR CONDITIONS, INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS -OF MERCHANTABILITY, MERCHANTABLE QUALITY OR FITNESS FOR A PARTICULAR -PURPOSE, OR ANY WARRANTY OF TITLE OR NON-INFRINGEMENT, OR THAT THE WORK -(OR ANY PORTION THEREOF) IS CORRECT, USEFUL, BUG-FREE OR FREE OF VIRUSES. -YOU MUST PASS THIS DISCLAIMER ON WHENEVER YOU DISTRIBUTE THE WORK OR DERIVATIVE -WORKS. - -Indemnity. You agree to defend, indemnify and hold harmless the Author and the -Publisher from and against any claims, suits, losses, damages, liabilities, -costs, and expenses (including reasonable legal or attorneys’ fees) -resulting from or relating to any use of the Work by You. - -Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, -IN NO EVENT WILL THE AUTHOR OR THE PUBLISHER BE LIABLE TO YOU ON ANY LEGAL -THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY -DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK OR OTHERWISE, -EVEN IF THE AUTHOR OR THE PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY -OF SUCH DAMAGES. - -Termination. - This License and the rights granted hereunder will terminate -automatically upon any breach by You of any term of this License. -Individuals or entities who have received Derivative Works from You under -this License, however, will not have their licenses terminated provided such -individuals or entities remain in full compliance with those licenses. -Sections 1, 2, 6, 7, 8, 9, 10 and 11 will survive any termination of -this License. - If You bring a copyright, trademark, patent or any other infringement -claim against any contributor over infringements You claim are made by the -Work, your License from such contributor to the Work ends automatically. - Subject to the above terms and conditions, this License is perpetual -(for the duration of the applicable copyright in the Work). -Notwithstanding the above, the Author reserves the right to release the Work -under different license terms or to stop distributing the Work at any time; -provided, however that any such election will not serve to withdraw this -License (or any other license that has been, or is required to be, -granted under the terms of this License), and this License will continue -in full force and effect unless terminated as stated above. - -Publisher. The parties hereby confirm that the Publisher shall not, under -any circumstances, be responsible for and shall not have any liability -in respect of the subject matter of this License. The Publisher makes no -warranty whatsoever in connection with the Work and shall not be liable -to You or any party on any legal theory for any damages whatsoever, including -without limitation any general, special, incidental or consequential damages -arising in connection to this license. The Publisher reserves the right to -cease making the Work available to You at any time without notice - -Miscellaneous - This License shall be governed by the laws of the location of the head -office of the Author or if the Author is an individual, the laws of -location of the principal place of residence of the Author. - If any provision of this License is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of the -remainder of the terms of this License, and without further action by the -parties to this License, such provision shall be reformed to the minimum -extent necessary to make such provision valid and enforceable. - No term or provision of this License shall be deemed waived and no -breach consented to unless such waiver or consent shall be in writing -and signed by the party to be charged with such waiver or consent. - This License constitutes the entire agreement between the parties -with respect to the Work licensed herein. There are no understandings, -agreements or representations with respect to the Work not specified herein. -The Author shall not be bound by any additional provisions that may appear -in any communication from You. This License may not be modified without -the mutual written agreement of the Author and You. - - -With respect to DocumentFormat.OpenXml -====================================== - -(https://github.com/OfficeDev/Open-XML-SDK/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to ExcelNumberFormat -================================= - -(https://github.com/andersnm/ExcelNumberFormat/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2017 andersnm - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to jose-jwt -======================== - -(https://github.com/dvsekhvalnov/jose-jwt/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014-2019 dvsekhvalnov - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With resepect to ExcelDataReader -================================ - -(https://github.com/ExcelDataReader/ExcelDataReader/blob/develop/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014 ExcelDataReader - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepect to OPC UA Example Code -==================================== - - * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved. - * - * OPC Foundation MIT License 1.00 - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * The complete license agreement can be found here: - * http://opcfoundation.org/License/MIT/1.00/ - - -With respect to OPC Foundation -============================== - -RCL License -Reciprocal Community License 1.00 (RCL1.00) -Version 1.00, June 24, 2009 -Copyright (C) 2008,2009 OPC Foundation, Inc., All Rights Reserved. - -https://opcfoundation.org/license/rcl.html - -Remark: PHOENIX CONTACT GmbH & Co. KG and Festo SE & Co. KG are members -of OPC foundation. - -With respect to MSAGL (Microsoft Automatic Graph Layout) -======================================================== -(see: https://github.com/microsoft/automatic-graph-layout/blob/master/LICENSE) - -Microsoft Automatic Graph Layout, MSAGL - -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -""Software""), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With respect to Glob (https://www.nuget.org/packages/Glob/) -=========================================================== -(see: https://raw.githubusercontent.com/kthompson/glob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2013-2019 Kevin Thompson - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to Magick.NET -========================== - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -With respect to SSharp.NET library -================================== - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/src/AasxRestConsoleServer/Program.cs b/src/AasxRestConsoleServer/Program.cs deleted file mode 100644 index 56e5cadf0..000000000 --- a/src/AasxRestConsoleServer/Program.cs +++ /dev/null @@ -1,70 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo AG & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using AasxRestServerLibrary; -using AdminShellNS; - -namespace AasxRestConsoleServer -{ - public static class Program - { - static void Main(string[] args) - { - Console.Error.WriteLine( - "AAS Console Server. (c) 2019 Michael Hoffmeister, Festo AG & Co. KG. See LICENSE.TXT."); - - // default command line options - var fn = "usb-stick-REST-demo.aasx"; - var host = "localhost"; - var port = "1111"; - - // parse - int i = 0; - while (i < args.Length) - { - var x = args[i].Trim().ToLower(); - - // real option? - if (i < args.Length - 1) - { - if (x == "-host") - { - host = args[i + 1]; - i += 2; - continue; - } - - if (x == "-port") - { - port = args[i + 1]; - i += 2; - continue; - } - } - - // last?? - fn = args[i]; - i += 1; - } - - // load? - var package = new AdminShellPackageEnv(fn); - AasxRestServer.Start(package, host, port, new GrapevineLoggerToConsole()); - - // wait for RETURN - Console.ReadLine(); - AasxRestServer.Stop(); - } - } -} diff --git a/src/AasxRestConsoleServer/Properties/AssemblyInfo.cs b/src/AasxRestConsoleServer/Properties/AssemblyInfo.cs deleted file mode 100644 index d3b5e5d78..000000000 --- a/src/AasxRestConsoleServer/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die einer Assembly zugeordnet sind. -[assembly: AssemblyTitle("AasxRestConsoleServer")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("AasxRestConsoleServer")] -[assembly: AssemblyCopyright("Copyright © 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly -// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von -// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. -[assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird -[assembly: Guid("6c45112d-b7f0-4463-be6d-a8a2b5a547bf")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, -// übernehmen, indem Sie "*" eingeben: -//// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] From c8fc64733d0678b2f07591e2d6a88277c9e5516d Mon Sep 17 00:00:00 2001 From: Alexander Wollbrink Date: Fri, 12 Jul 2024 11:49:17 +0200 Subject: [PATCH 08/13] remove AasxRestServerLibrary --- .../AasxHttpContextHelper.cs | 1611 ----------------- .../AasxHttpHandleStore.cs | 114 -- src/AasxRestServerLibrary/AasxRestClient.cs | 202 --- src/AasxRestServerLibrary/AasxRestServer.cs | 418 ----- .../AasxRestServerLibrary.csproj | 15 - .../Docs/REST_routes.xlsx | Bin 156220 -> 0 bytes .../GrapevineLoggerConsumers.cs | 123 -- src/AasxRestServerLibrary/LICENSE.txt | 1475 --------------- .../Properties/AssemblyInfo.cs | 36 - 9 files changed, 3994 deletions(-) delete mode 100644 src/AasxRestServerLibrary/AasxHttpContextHelper.cs delete mode 100644 src/AasxRestServerLibrary/AasxHttpHandleStore.cs delete mode 100644 src/AasxRestServerLibrary/AasxRestClient.cs delete mode 100644 src/AasxRestServerLibrary/AasxRestServer.cs delete mode 100644 src/AasxRestServerLibrary/AasxRestServerLibrary.csproj delete mode 100644 src/AasxRestServerLibrary/Docs/REST_routes.xlsx delete mode 100644 src/AasxRestServerLibrary/GrapevineLoggerConsumers.cs delete mode 100644 src/AasxRestServerLibrary/LICENSE.txt delete mode 100644 src/AasxRestServerLibrary/Properties/AssemblyInfo.cs diff --git a/src/AasxRestServerLibrary/AasxHttpContextHelper.cs b/src/AasxRestServerLibrary/AasxHttpContextHelper.cs deleted file mode 100644 index 4f229061a..000000000 --- a/src/AasxRestServerLibrary/AasxHttpContextHelper.cs +++ /dev/null @@ -1,1611 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo AG & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Dynamic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Net; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using AasxCompatibilityModels; -using AdminShellNS; -using Grapevine.Interfaces.Server; -using Grapevine.Server; -using Grapevine.Server.Attributes; -using Grapevine.Shared; -using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; - -/* -Please notice: -The API and REST routes implemented in this version of the source code are not specified and standardised by the -specification Details of the Administration Shell. The hereby stated approach is solely the opinion of its author(s). -*/ - -namespace AasxRestServerLibrary -{ - public class AasxHttpContextHelper - { - - public AdminShellPackageEnv Package = null; - - public AasxHttpHandleStore IdRefHandleStore = new AasxHttpHandleStore(); - - #region // Path helpers - - public bool PathEndsWith(string path, string tag) - { - return path.Trim().ToLower().TrimEnd('/').EndsWith(tag); - } - - public bool PathEndsWith(IHttpContext context, string tag) - { - return PathEndsWith(context.Request.PathInfo, tag); - } - - // see also: https://stackoverflow.com/questions/33619469/ - // how-do-i-write-a-regular-expression-to-route-traffic-with-grapevine-when-my-requ - - public Match PathInfoRegexMatch(MethodBase methodWithRestRoute, string input) - { - if (methodWithRestRoute == null) - return null; - string piRegex = null; - foreach (var attr in methodWithRestRoute.GetCustomAttributes()) - if (attr.PathInfo != null) - piRegex = attr.PathInfo; - if (piRegex == null) - return null; - var m = Regex.Match(input, piRegex); - return m; - } - - public List CreateHandlesFromQueryString( - System.Collections.Specialized.NameValueCollection queryStrings) - { - // start - var res = new List(); - if (queryStrings == null) - return res; - - // over all query strings - foreach (var kr in queryStrings.AllKeys) - { - try - { - var k = kr.Trim().ToLower(); - var v = queryStrings[k]; - if (k.StartsWith("q") && k.Length > 1 && v.Contains(',')) - { - var vl = v.Split(','); - if (vl.Length == 2) - { - var id = new AdminShell.Identification(vl[0], vl[1]); - var h = new AasxHttpHandleIdentification(id, "@" + k); - res.Add(h); - } - } - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); - } - } - - // done - return res; - } - - public List CreateHandlesFromRawUrl(string rawUrl) - { - // start - var res = new List(); - if (rawUrl == null) - return res; - - // un-escape - var url = System.Uri.UnescapeDataString(rawUrl); - - // split for query string traditional - var i = url.IndexOf('?'); - if (i < 0 || i == url.Length - 1) - return res; - var query = url.Substring(i + 1); - - // try make a Regex wonder, again - var m = Regex.Match(query, @"(\s*([^&]+)(&|))+"); - if (m.Success && m.Groups.Count >= 3) - foreach (var cp in m.Groups[2].Captures) - { - var m2 = Regex.Match(cp.ToString(), @"\s*(\w+)\s*=\s*([^,]+),(.+)$"); - if (m2.Success && m2.Groups.Count >= 4) - { - var k = m2.Groups[1].ToString(); - var idt = m2.Groups[2].ToString(); - var ids = m2.Groups[3].ToString(); - - var id = new AdminShell.Identification(idt, ids); - var h = new AasxHttpHandleIdentification(id, "@" + k); - res.Add(h); - } - } - - // done - return res; - } - - #endregion - - #region // Access package structures - - public AdminShell.AdministrationShell FindAAS( - string aasid, System.Collections.Specialized.NameValueCollection queryStrings = null, string rawUrl = null) - { - // trivial - if (Package == null || Package.AasEnv == null || Package.AasEnv.AdministrationShells == null || - Package.AasEnv.AdministrationShells.Count < 1) - return null; - - // default aas? - if (aasid == null || aasid.Trim() == "" || aasid.Trim().ToLower() == "id") - return Package.AasEnv.AdministrationShells[0]; - - // resolve an ID? - var specialHandles = this.CreateHandlesFromRawUrl(rawUrl); - var handleId = IdRefHandleStore.ResolveSpecific(aasid, specialHandles); - if (handleId != null && handleId.identification != null) - return Package.AasEnv.FindAAS(handleId.identification); - - // no, iterate over idShort - return Package.AasEnv.FindAAS(aasid); - } - - public AdminShell.SubmodelRef FindSubmodelRefWithinAas( - AdminShell.AdministrationShell aas, string smid, - System.Collections.Specialized.NameValueCollection queryStrings = null, string rawUrl = null) - { - // trivial - if (Package == null || Package.AasEnv == null || aas == null || smid == null || smid.Trim() == "") - return null; - - // via handle - var specialHandles = this.CreateHandlesFromRawUrl(rawUrl); - var handleId = IdRefHandleStore.ResolveSpecific(smid, specialHandles); - - // no, iterate & find - foreach (var smref in aas.submodelRefs) - { - if (handleId != null && handleId.identification != null) - { - if (smref.Matches(handleId.identification)) - return smref; - } - else - { - var sm = this.Package.AasEnv.FindSubmodel(smref); - if (sm != null && sm.idShort != null && sm.idShort.Trim().ToLower() == smid.Trim().ToLower()) - return smref; - } - } - - // no - return null; - } - - public AdminShell.Submodel FindSubmodelWithinAas( - AdminShell.AdministrationShell aas, string smid, - System.Collections.Specialized.NameValueCollection queryStrings = null, string rawUrl = null) - { - // trivial - if (Package == null || Package.AasEnv == null || aas == null || smid == null || smid.Trim() == "") - return null; - - // via handle - var specialHandles = this.CreateHandlesFromRawUrl(rawUrl); - var handleId = IdRefHandleStore.ResolveSpecific(smid, specialHandles); - if (handleId != null && handleId.identification != null) - return Package.AasEnv.FindSubmodel(handleId.identification); - - // no, iterate & find - foreach (var smref in aas.submodelRefs) - { - var sm = this.Package.AasEnv.FindSubmodel(smref); - if (sm != null && sm.idShort != null && sm.idShort.Trim().ToLower() == smid.Trim().ToLower()) - return sm; - } - - // no - return null; - } - - public AdminShell.Submodel FindSubmodelWithoutAas( - string smid, System.Collections.Specialized.NameValueCollection queryStrings = null, - string rawUrl = null) - { - // trivial - if (Package == null || Package.AasEnv == null || smid == null || smid.Trim() == "") - return null; - - // via handle - var specialHandles = this.CreateHandlesFromRawUrl(rawUrl); - var handleId = IdRefHandleStore.ResolveSpecific(smid, specialHandles); - if (handleId != null && handleId.identification != null) - return Package.AasEnv.FindSubmodel(handleId.identification); - - // no, iterate & find - foreach (var sm in this.Package.AasEnv.Submodels) - { - if (sm != null && sm.idShort != null && sm.idShort.Trim().ToLower() == smid.Trim().ToLower()) - return sm; - } - - // no - return null; - } - - public AdminShell.ConceptDescription FindCdWithoutAas( - AdminShell.AdministrationShell aas, string cdid, - System.Collections.Specialized.NameValueCollection queryStrings = null, string rawUrl = null) - { - // trivial - if (Package == null || Package.AasEnv == null || aas == null || cdid == null || cdid.Trim() == "") - return null; - - // via handle - var specialHandles = this.CreateHandlesFromRawUrl(rawUrl); - var handleId = IdRefHandleStore.ResolveSpecific(cdid, specialHandles); - if (handleId != null && handleId.identification != null) - return Package.AasEnv.FindConceptDescription(handleId.identification); - - // no, iterate & find - foreach (var cd in Package.AasEnv.ConceptDescriptions) - { - if (cd.idShort != null && cd.idShort.Trim().ToLower() == cdid.Trim().ToLower()) - return cd; - } - - // no - return null; - } - - - public class FindSubmodelElementResult - { - public AdminShell.Referable elem = null; - public AdminShell.SubmodelElementWrapper wrapper = null; - public AdminShell.Referable parent = null; - - public FindSubmodelElementResult( - AdminShell.Referable elem = null, AdminShell.SubmodelElementWrapper wrapper = null, - AdminShell.Referable parent = null) - { - this.elem = elem; - this.wrapper = wrapper; - this.parent = parent; - } - } - - public FindSubmodelElementResult FindSubmodelElement( - AdminShell.Referable parent, List wrappers, - string[] elemids, int elemNdx = 0) - { - // trivial - if (wrappers == null || elemids == null || elemNdx >= elemids.Length) - return null; - - // dive into each - foreach (var smw in wrappers) - if (smw.submodelElement != null) - { - // idShort need to match - if (smw.submodelElement.idShort.Trim().ToLower() != elemids[elemNdx].Trim().ToLower()) - continue; - - // leaf - if (elemNdx == elemids.Length - 1) - { - return new FindSubmodelElementResult(elem: smw.submodelElement, wrapper: smw, parent: parent); - } - else - { - // recurse into? - var xsmc = smw.submodelElement as AdminShell.SubmodelElementCollection; - if (xsmc != null) - { - var r = FindSubmodelElement(xsmc, xsmc.value, elemids, elemNdx + 1); - if (r != null) - return r; - } - - var xop = smw.submodelElement as AdminShell.Operation; - if (xop != null) - { - var w2 = new List(); - for (int i = 0; i < 2; i++) - foreach (var opv in xop[i]) - if (opv.value != null) - w2.Add(opv.value); - - var r = FindSubmodelElement(xop, w2, elemids, elemNdx + 1); - if (r != null) - return r; - } - } - } - - // nothing - return null; - } - - #endregion - - #region // Generate responses - - - protected static void SendJsonResponse( - IHttpContext context, object obj, IContractResolver contractResolver = null) - { - var settings = new JsonSerializerSettings(); - if (contractResolver != null) - settings.ContractResolver = contractResolver; - var json = JsonConvert.SerializeObject(obj, Formatting.Indented, settings); - var buffer = context.Request.ContentEncoding.GetBytes(json); - var length = buffer.Length; - - context.Response.ContentType = ContentType.JSON; - context.Response.ContentEncoding = Encoding.UTF8; - context.Response.ContentLength64 = length; - context.Response.SendResponse(buffer); - } - - protected static void SendTextResponse(IHttpContext context, string txt, string mimeType = null) - { - context.Response.ContentType = ContentType.TEXT; - if (mimeType != null) - context.Response.Advanced.ContentType = mimeType; - context.Response.ContentEncoding = Encoding.UTF8; - context.Response.ContentLength64 = txt.Length; - context.Response.SendResponse(txt); - } - - protected static void SendStreamResponse( - IHttpContext context, Stream stream, string headerAttachmentFileName = null) - { - context.Response.ContentType = ContentType.APPLICATION; - context.Response.ContentLength64 = stream.Length; - context.Response.SendChunked = true; - - if (headerAttachmentFileName != null) - context.Response.AddHeader("Content-Disposition", $"attachment; filename={headerAttachmentFileName}"); - - stream.CopyTo(context.Response.Advanced.OutputStream); - context.Response.Advanced.Close(); - } - - #endregion - - #region AAS and Asset - - public void EvalGetAasAndAsset(IHttpContext context, string aasid, bool deep = false, bool complete = false) - { - // access the first AAS - var aas = this.FindAAS(aasid, context.Request.QueryString, context.Request.RawUrl); - if (aas == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, $"No AAS with id '{aasid}' found."); - return; - } - - // try to get the asset as well - var asset = this.Package.AasEnv.FindAsset(aas.assetRef); - - // result - dynamic res = new ExpandoObject(); - res.AAS = aas; - res.Asset = asset; - - // return as JSON - var cr = new AdminShellConverters.AdaptiveFilterContractResolver(deep: deep, complete: complete); - SendJsonResponse(context, res, cr); - } - - public void EvalGetAasEnv(IHttpContext context, string aasid) - { - if (this.Package == null || this.Package.AasEnv == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.InternalServerError, $"Error accessing internal data structures."); - return; - } - - // access the first AAS - var aas = this.FindAAS(aasid, context.Request.QueryString, context.Request.RawUrl); - if (aas == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, $"No AAS with id '{aasid}' found."); - return; - } - - // create a new, filtered AasEnv - AdminShell.AdministrationShellEnv copyenv = null; - try - { - copyenv = AdminShell.AdministrationShellEnv.CreateFromExistingEnv( - this.Package.AasEnv, filterForAas: new List(new[] { aas })); - } - catch (Exception ex) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, $"Cannot filter aas envioronment: {ex.Message}."); - return; - } - - // return as FILE - try - { - using (var ms = new MemoryStream()) - { - // build a file name - var fn = "aasenv.json"; - if (aas.idShort != null) - fn = aas.idShort + "." + fn; - // serialize via helper - var jsonwriter = copyenv.SerialiazeJsonToStream(new StreamWriter(ms), leaveJsonWriterOpen: true); - // write out again - ms.Position = 0; - SendStreamResponse(context, ms, Path.GetFileName(fn)); - // bit ugly - jsonwriter.Close(); - } - } - catch (Exception ex) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, - $"Cannot serialize and send aas envioronment: {ex.Message}."); - } - } - - - public void EvalGetAasThumbnail(IHttpContext context, string aasid) - { - if (this.Package == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.InternalServerError, $"Error accessing internal data structures."); - return; - } - - // access the first AAS - var aas = this.FindAAS(aasid, context.Request.QueryString, context.Request.RawUrl); - if (aas == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, $"No AAS with id '{aasid}' found."); - return; - } - - // access the thumbnail - // Note: in this version, the thumbnail is not specific to the AAS, but maybe in later versions ;-) - Uri thumbUri = null; - var thumbStream = this.Package.GetLocalThumbnailStream(ref thumbUri); - if (thumbStream == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, $"No thumbnail available in package."); - return; - } - - // return as FILE - SendStreamResponse(context, thumbStream, Path.GetFileName(thumbUri?.ToString() ?? "")); - thumbStream.Close(); - } - - public void EvalPutAas(IHttpContext context) - { - // first check - if (context.Request.Payload == null || context.Request.ContentType != ContentType.JSON) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, $"No payload or content type is not JSON."); - return; - } - - // list of Identification - AdminShell.AdministrationShell aas = null; - try - { - aas = Newtonsoft.Json.JsonConvert.DeserializeObject( - context.Request.Payload); - } - catch (Exception ex) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, $"Cannot deserialize payload: {ex.Message}."); - return; - } - - // need id for idempotent behaviour - if (aas.identification == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, - $"Identification of entity is (null); PUT cannot be performed."); - return; - } - - // datastructure update - if (this.Package == null || this.Package.AasEnv == null || - this.Package.AasEnv.AdministrationShells == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.InternalServerError, $"Error accessing internal data structures."); - return; - } - context.Server.Logger.Debug( - $"Putting AdministrationShell with idShort {aas.idShort ?? "--"} and " + - $"id {aas.identification.ToString()}"); - var existingAas = this.Package.AasEnv.FindAAS(aas.identification); - if (existingAas != null) - this.Package.AasEnv.AdministrationShells.Remove(existingAas); - this.Package.AasEnv.AdministrationShells.Add(aas); - - // simple OK - SendTextResponse(context, "OK" + ((existingAas != null) ? " (updated)" : " (new)")); - } - - public void EvalDeleteAasAndAsset(IHttpContext context, string aasid, bool deleteAsset = false) - { - // datastructure update - if (this.Package == null || this.Package.AasEnv == null || - this.Package.AasEnv.AdministrationShells == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.InternalServerError, $"Error accessing internal data structures."); - return; - } - - // access the AAS - var aas = this.FindAAS(aasid, context.Request.QueryString, context.Request.RawUrl); - if (aas == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, $"No AAS with idShort '{aasid}' found."); - return; - } - - // find the asset - var asset = this.Package.AasEnv.FindAsset(aas.assetRef); - - // delete - context.Server.Logger.Debug( - $"Deleting AdministrationShell with idShort {aas.idShort ?? "--"} and " + - $"id {aas.identification?.ToString() ?? "--"}"); - this.Package.AasEnv.AdministrationShells.Remove(aas); - - if (deleteAsset && asset != null) - { - context.Server.Logger.Debug( - $"Deleting Asset with idShort {asset.idShort ?? "--"} and " + - $"id {asset.identification?.ToString() ?? "--"}"); - this.Package.AasEnv.Assets.Remove(asset); - } - - // simple OK - SendTextResponse(context, "OK"); - } - - #endregion - - #region // Asset links - - public void EvalGetAssetLinks(IHttpContext context, string assetid) - { - // trivial - if (assetid == null) - return; - - // do a manual search - var res = new List(); - var specialHandles = this.CreateHandlesFromQueryString(context.Request.QueryString); - var handle = IdRefHandleStore.ResolveSpecific(assetid, specialHandles); - if (handle != null && handle.identification != null) - { - foreach (var aas in this.Package.AasEnv.AdministrationShells) - if (aas.assetRef != null && aas.assetRef.Matches(handle.identification)) - { - dynamic o = new ExpandoObject(); - o.identification = aas.identification; - o.idShort = aas.idShort; - res.Add(o); - } - } - else - { - foreach (var aas in this.Package.AasEnv.AdministrationShells) - if (aas.idShort != null && aas.idShort.Trim() != "" && - aas.idShort.Trim().ToLower() == assetid.Trim().ToLower()) - { - dynamic o = new ExpandoObject(); - o.identification = aas.identification; - o.idShort = aas.idShort; - res.Add(o); - } - } - - // return as JSON - SendJsonResponse(context, res); - } - - public void EvalPutAsset(IHttpContext context) - { - // first check - if (context.Request.Payload == null || context.Request.ContentType != ContentType.JSON) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, $"No payload or content type is not JSON."); - return; - } - - // de-serialize asset - AdminShell.Asset asset = null; - try - { - asset = Newtonsoft.Json.JsonConvert.DeserializeObject(context.Request.Payload); - } - catch (Exception ex) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, $"Cannot deserialize payload: {ex.Message}."); - return; - } - - // need id for idempotent behaviour - if (asset.identification == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, - $"Identification of entity is (null); PUT cannot be performed."); - return; - } - - // datastructure update - if (this.Package == null || this.Package.AasEnv == null || this.Package.AasEnv.Assets == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.InternalServerError, - $"Error accessing internal data structures."); - return; - } - context.Server.Logger.Debug($"Adding Asset with idShort {asset.idShort ?? "--"}"); - var existingAsset = this.Package.AasEnv.FindAsset(asset.identification); - if (existingAsset != null) - this.Package.AasEnv.Assets.Remove(existingAsset); - this.Package.AasEnv.Assets.Add(asset); - - // simple OK - SendTextResponse(context, "OK" + ((existingAsset != null) ? " (updated)" : " (new)")); - } - #endregion - - #region // List of Submodels - - public class GetSubmodelsItem - { - public AdminShell.Identification id = new AdminShell.Identification(); - public string idShort = ""; - public string kind = ""; - - public GetSubmodelsItem() { } - - public GetSubmodelsItem(AdminShell.Identification id, string idShort, string kind) - { - this.id = id; - this.idShort = idShort; - this.kind = kind; - } - - public GetSubmodelsItem(AdminShell.Identifiable idi, string kind) - { - this.id = idi.identification; - this.idShort = idi.idShort; - this.kind = kind; - } - } - - public void EvalGetSubmodels(IHttpContext context, string aasid) - { - // access the AAS - var aas = this.FindAAS(aasid, context.Request.QueryString, context.Request.RawUrl); - if (aas == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, $"No AAS with idShort '{aasid}' found."); - return; - } - - // build a list of results - var res = new List(); - - // get all submodels - foreach (var smref in aas.submodelRefs) - { - var sm = this.Package.AasEnv.FindSubmodel(smref); - if (sm != null) - res.Add(new GetSubmodelsItem(sm, sm.kind.kind)); - } - - // return as JSON - SendJsonResponse(context, res); - } - - public void EvalPutSubmodel(IHttpContext context, string aasid) - { - // first check - if (context.Request.Payload == null || context.Request.ContentType != ContentType.JSON) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, $"No payload or content type is not JSON."); - return; - } - - // access the AAS - var aas = this.FindAAS(aasid, context.Request.QueryString, context.Request.RawUrl); - if (aas == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, $"No AAS with idShort '{aasid}' found."); - return; - } - - // de-serialize Submodel - AdminShell.Submodel submodel = null; - try - { - submodel = Newtonsoft.Json.JsonConvert.DeserializeObject(context.Request.Payload); - } - catch (Exception ex) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, $"Cannot deserialize payload: {ex.Message}."); - return; - } - - // need id for idempotent behaviour - if (submodel.identification == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, - $"Identification of entity is (null); PUT cannot be performed."); - return; - } - - // datastructure update - if (this.Package == null || this.Package.AasEnv == null || this.Package.AasEnv.Assets == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.InternalServerError, $"Error accessing internal data structures."); - return; - } - - // add Submodel - context.Server.Logger.Debug( - $"Adding Submodel with idShort {submodel.idShort ?? "--"} and " + - $"id {submodel.identification?.ToString()}"); - var existingSm = this.Package.AasEnv.FindSubmodel(submodel.identification); - if (existingSm != null) - this.Package.AasEnv.Submodels.Remove(existingSm); - this.Package.AasEnv.Submodels.Add(submodel); - - // add SubmodelRef to AAS - var newsmr = AdminShell.SubmodelRef.CreateNew( - "Submodel", true, submodel.identification.idType, submodel.identification.id); - var existsmr = aas.HasSubmodelRef(newsmr); - if (!existsmr) - { - context.Server.Logger.Debug( - $"Adding SubmodelRef to AAS with idShort {aas.idShort ?? "--"} and " + - $"id {aas.identification?.ToString() ?? "--"}"); - aas.AddSubmodelRef(newsmr); - } - - // simple OK - SendTextResponse(context, "OK" + ((existingSm != null) ? " (updated)" : " (new)")); - } - - public void EvalDeleteSubmodel(IHttpContext context, string aasid, string smid) - { - // first check - if (context.Request.Payload == null || context.Request.ContentType != ContentType.JSON) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, $"No payload or content type is not JSON."); - return; - } - - // access the AAS (absolutely mandatory) - var aas = this.FindAAS(aasid, context.Request.QueryString, context.Request.RawUrl); - if (aas == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, $"No AAS with idShort '{aasid}' found."); - return; - } - - // delete SubmodelRef 1st - var smref = this.FindSubmodelRefWithinAas(aas, smid, context.Request.QueryString, context.Request.RawUrl); - if (smref != null) - { - context.Server.Logger.Debug( - $"Removing SubmodelRef {smid} from AAS with idShort {aas.idShort ?? "--"} and " + - $"id {aas.identification?.ToString() ?? "--"}"); - aas.submodelRefs.Remove(smref); - } - - // delete Submodel 2nd - var sm = this.FindSubmodelWithoutAas(smid, context.Request.QueryString, context.Request.RawUrl); - if (sm != null) - { - context.Server.Logger.Debug($"Removing Submodel {smid} from data structures."); - this.Package.AasEnv.Submodels.Remove(sm); - } - - // simple OK - var cmt = ""; - if (smref == null && sm == null) - cmt += " (nothing deleted)"; - cmt += ((smref != null) ? " (SubmodelRef deleted)" : "") + ((sm != null) ? " (Submodel deleted)" : ""); - SendTextResponse(context, "OK" + cmt); - } - - #endregion - - #region // Submodel Complete - - public void EvalGetSubmodelContents( - IHttpContext context, string aasid, string smid, bool deep = false, bool complete = false) - { - // access AAS and Submodel - var aas = this.FindAAS(aasid, context.Request.QueryString, context.Request.RawUrl); - var sm = this.FindSubmodelWithinAas(aas, smid, context.Request.QueryString, context.Request.RawUrl); - if (sm == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, - $"No AAS '{aasid}' or no Submodel with idShort '{smid}' found."); - return; - } - - // return as JSON - var cr = new AdminShellConverters.AdaptiveFilterContractResolver(deep: deep, complete: complete); - SendJsonResponse(context, sm, cr); - } - - public void EvalGetSubmodelContentsAsTable(IHttpContext context, string aasid, string smid) - { - // access AAS and Submodel - var aas = this.FindAAS(aasid, context.Request.QueryString, context.Request.RawUrl); - var sm = this.FindSubmodelWithinAas(aas, smid, context.Request.QueryString, context.Request.RawUrl); - if (sm == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, - $"No AAS '{aasid}' or no Submodel with idShort '{smid}' found."); - return; - } - - // AAS ENV - if (this.Package == null || this.Package.AasEnv == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.InternalServerError, - $"Error accessing internal data structures."); - return; - } - - // make a table - var table = new List(); - sm.RecurseOnSubmodelElements(null, (o, parents, sme) => - { - // start a row - dynamic row = new ExpandoObject(); - - // defaults - row.idShorts = ""; - row.typeName = ""; - row.semIdType = ""; - row.semId = ""; - row.shortName = ""; - row.unit = ""; - row.value = ""; - - // idShort is a concatenation - var path = ""; - foreach (var p in parents) - path += p.idShort + "/"; - - // SubnmodelElement general - row.idShorts = path + (sme.idShort ?? "(-)"); - row.typeName = sme.GetElementName(); - if (sme.semanticId == null || sme.semanticId.Keys == null) - { } - else if (sme.semanticId.Keys.Count > 1) - { - row.semId = "(complex)"; - } - else - { - row.semIdType = sme.semanticId.Keys[0].idType; - row.semId = sme.semanticId.Keys[0].value; - } - - // try find a concept description - if (sme.semanticId != null) - { - var cd = this.Package.AasEnv.FindConceptDescription(sme.semanticId.Keys); - if (cd != null) - { - var ds = cd.GetIEC61360(); - if (ds != null) - { - row.shortName = (ds.shortName == null ? "" : ds.shortName.GetDefaultStr()); - row.unit = ds.unit ?? ""; - } - } - } - - // try add a value - if (sme is AdminShell.Property) - { - var p = sme as AdminShell.Property; - row.value = "" + (p.value ?? "") + ((p.valueId != null) ? p.valueId.ToString() : ""); - } - - if (sme is AdminShell.File) - { - var p = sme as AdminShell.File; - row.value = "" + p.value; - } - - if (sme is AdminShell.Blob) - { - var p = sme as AdminShell.Blob; - if (p.value.Length < 128) - row.value = "" + p.value; - else - row.value = "(" + p.value.Length + " bytes)"; - } - - if (sme is AdminShell.ReferenceElement) - { - var p = sme as AdminShell.ReferenceElement; - row.value = "" + p.value.ToString(); - } - - if (sme is AdminShell.RelationshipElement) - { - var p = sme as AdminShell.RelationshipElement; - row.value = "" + (p.first?.ToString() ?? "(-)") + " <-> " + (p.second?.ToString() ?? "(-)"); - } - - // now, add the row - table.Add(row); - - // recurse - return true; - }); - - // return as JSON - SendJsonResponse(context, table); - } - - #endregion - - #region // Submodel Elements - - public void EvalGetSubmodelElementContents( - IHttpContext context, string aasid, string smid, string[] elemids, bool deep = false, - bool complete = false) - { - // access AAS and Submodel - var aas = this.FindAAS(aasid, context.Request.QueryString, context.Request.RawUrl); - var sm = this.FindSubmodelWithinAas(aas, smid, context.Request.QueryString, context.Request.RawUrl); - if (sm == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, - $"No AAS '{aasid}' or no Submodel with idShort '{smid}' found."); - return; - } - - // find the right SubmodelElement - var sme = this.FindSubmodelElement(sm, sm.submodelElements, elemids); - if (sme == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, - $"No matching element in Submodel found."); - return; - } - - // return as JSON - var cr = new AdminShellConverters.AdaptiveFilterContractResolver(deep: deep, complete: complete); - SendJsonResponse(context, sme, cr); - } - - public void EvalGetSubmodelElementsBlob(IHttpContext context, string aasid, string smid, string[] elemids) - { - // access AAS and Submodel - var aas = this.FindAAS(aasid, context.Request.QueryString, context.Request.RawUrl); - var sm = this.FindSubmodelWithinAas(aas, smid, context.Request.QueryString, context.Request.RawUrl); - if (sm == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, - $"No AAS '{aasid}' or no Submodel with idShort '{smid}' found."); - return; - } - - // find the right SubmodelElement - var fse = this.FindSubmodelElement(sm, sm.submodelElements, elemids); - var smeb = fse?.elem as AdminShell.Blob; - if (smeb == null || smeb.value == null || smeb.value == "") - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, $"No matching Blob element in Submodel found."); - return; - } - - // return as TEXT - SendTextResponse(context, smeb.value, mimeType: smeb.mimeType); - } - - public void EvalGetSubmodelElementsProperty(IHttpContext context, string aasid, string smid, string[] elemids) - { - // access AAS and Submodel - var aas = this.FindAAS(aasid, context.Request.QueryString, context.Request.RawUrl); - var sm = this.FindSubmodelWithinAas(aas, smid, context.Request.QueryString, context.Request.RawUrl); - if (sm == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, - $"No AAS '{aasid}' or no Submodel with idShort '{smid}' found."); - return; - } - - // find the right SubmodelElement - var fse = this.FindSubmodelElement(sm, sm.submodelElements, elemids); - var smep = fse?.elem as AdminShell.Property; - if (smep == null || smep.value == null || smep.value == "") - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, $"No matching Property element in Submodel found."); - return; - } - - // a little bit of demo - string strval = smep.value; - if (smep.HasQualifierOfType("DEMO") != null && smep.value != null && smep.valueType != null && - smep.valueType.Trim().ToLower() == "double" && - double.TryParse(smep.value, NumberStyles.Any, CultureInfo.InvariantCulture, out double dblval)) - { - dblval += Math.Sin((0.001 * DateTime.UtcNow.Millisecond) * 6.28); - strval = dblval.ToString(CultureInfo.InvariantCulture); - } - - // return as little dynamic object - dynamic res = new ExpandoObject(); - res.value = strval; - if (smep.valueId != null) - res.valueId = smep.valueId; - - // send - SendJsonResponse(context, res); - } - - public void EvalGetSubmodelElementsFile(IHttpContext context, string aasid, string smid, string[] elemids) - { - // access AAS and Submodel - var aas = this.FindAAS(aasid, context.Request.QueryString, context.Request.RawUrl); - var sm = this.FindSubmodelWithinAas(aas, smid, context.Request.QueryString, context.Request.RawUrl); - if (sm == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, - $"No AAS '{aasid}' or no Submodel with idShort '{smid}' found."); - return; - } - - // find the right SubmodelElement - var fse = this.FindSubmodelElement(sm, sm.submodelElements, elemids); - var smef = fse?.elem as AdminShell.File; - if (smef == null || smef.value == null || smef.value == "") - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, - $"No matching File element in Submodel found."); - return; - } - - // access - var packageStream = this.Package.GetLocalStreamFromPackage(smef.value); - if (packageStream == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, - $"No file contents available in package."); - return; - } - - // return as FILE - SendStreamResponse(context, packageStream, Path.GetFileName(smef.value)); - packageStream.Close(); - } - - public void EvalPutSubmodelElementContents(IHttpContext context, string aasid, string smid, string[] elemids) - { - // first check - if (context.Request.Payload == null || context.Request.ContentType != ContentType.JSON) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, $"No payload or content type is not JSON."); - return; - } - - // de-serialize SubmodelElement - AdminShell.SubmodelElement sme = null; - try - { - sme = Newtonsoft.Json.JsonConvert.DeserializeObject( - context.Request.Payload, new AdminShellConverters.JsonAasxConverter("modelType", "name")); - } - catch (Exception ex) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, $"Cannot deserialize payload: {ex.Message}."); - return; - } - - // need id for idempotent behaviour - if (sme?.idShort == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, - $"entity or idShort of entity is (null); PUT cannot be performed."); - return; - } - - // access AAS and Submodel - var aas = this.FindAAS(aasid, context.Request.QueryString, context.Request.RawUrl); - var sm = this.FindSubmodelWithinAas(aas, smid, context.Request.QueryString, context.Request.RawUrl); - if (sm == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, - $"No AAS '{aasid}' or no Submodel with idShort '{smid}' found."); - return; - } - - // special case: parent is Submodel itself - var updated = false; - if (elemids == null || elemids.Length < 1) - { - var existsmw = sm.FindSubmodelElementWrapper(sme.idShort); - if (existsmw != null) - { - updated = true; - context.Server.Logger.Debug($"Removing old SubmodelElement {sme.idShort} from Submodel {smid}."); - sm.submodelElements.Remove(existsmw); - } - - context.Server.Logger.Debug($"Adding new SubmodelElement {sme.idShort} to Submodel {smid}."); - sm.Add(sme); - } - else - { - // find the right SubmodelElement - var parent = this.FindSubmodelElement(sm, sm.submodelElements, elemids); - if (parent == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, $"No matching element in Submodel found."); - return; - } - - if (parent.elem != null && parent.elem is AdminShell.SubmodelElementCollection parentsmc) - { - var existsmw = parentsmc.FindFirstIdShort(sme.idShort); - if (existsmw != null) - { - updated = true; - context.Server.Logger.Debug( - $"Removing old SubmodelElement {sme.idShort} from SubmodelCollection."); - parentsmc.value.Remove(existsmw); - } - - context.Server.Logger.Debug($"Adding new SubmodelElement {sme.idShort} to SubmodelCollection."); - parentsmc.Add(sme); - } - else - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, - $"Matching SubmodelElement in Submodel {smid} is not suitable to add childs."); - return; - } - - } - - // simple OK - SendTextResponse(context, "OK" + (updated ? " (with updates)" : "")); - } - - public void EvalDeleteSubmodelElementContents( - IHttpContext context, string aasid, string smid, string[] elemids) - { - // access AAS and Submodel - var aas = this.FindAAS(aasid, context.Request.QueryString, context.Request.RawUrl); - var sm = this.FindSubmodelWithinAas(aas, smid, context.Request.QueryString, context.Request.RawUrl); - if (sm == null || elemids == null || elemids.Length < 1) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, - $"No AAS '{aasid}' or no Submodel with idShort '{smid}' found or " + - $"no elements to delete specified."); - return; - } - - // OK, Submodel and Element existing - var fse = this.FindSubmodelElement(sm, sm.submodelElements, elemids); - if (fse == null || fse.elem == null || fse.parent == null || fse.wrapper == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, $"No matching element in Submodel found."); - return; - } - - // where to delete? - var deleted = false; - var elinfo = string.Join(".", elemids); - if (fse.parent == sm) - { - context.Server.Logger.Debug($"Deleting specified SubmodelElement {elinfo} from Submodel {smid}."); - sm.submodelElements.Remove(fse.wrapper); - deleted = true; - } - - if (fse.parent is AdminShell.SubmodelElementCollection smc) - { - context.Server.Logger.Debug( - $"Deleting specified SubmodelElement {elinfo} from SubmodelElementCollection {smc.idShort}."); - smc.value.Remove(fse.wrapper); - deleted = true; - } - - // simple OK - SendTextResponse(context, "OK" + (!deleted ? " (but nothing deleted)" : "")); - } - - public void EvalInvokeSubmodelElementOperation( - IHttpContext context, string aasid, string smid, string[] elemids) - { - // access AAS and Submodel - var aas = this.FindAAS(aasid, context.Request.QueryString, context.Request.RawUrl); - var sm = this.FindSubmodelWithinAas(aas, smid, context.Request.QueryString, context.Request.RawUrl); - if (sm == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, - $"No AAS '{aasid}' or no Submodel with idShort '{smid}' found."); - return; - } - - // find the right SubmodelElement - var fse = this.FindSubmodelElement(sm, sm.submodelElements, elemids); - var smep = fse?.elem as AdminShell.Operation; - if (smep == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, $"No matching Operation element in Submodel found."); - return; - } - - // make 1st expectation - int numExpectedInputArgs = smep.inputVariable?.Count ?? 0; - int numGivenInputArgs = 0; - int numExpectedOutputArgs = smep.outputVariable?.Count ?? 0; - var inputArguments = (new int[numExpectedInputArgs]).Select(x => "").ToList(); - var outputArguments = (new int[numExpectedOutputArgs]).Select(x => "my value").ToList(); - - // is a payload required? Always, if at least one input argument required - - if (smep.inputVariable != null && smep.inputVariable.Count > 0) - { - // payload present - if (context.Request.Payload == null || context.Request.ContentType != ContentType.JSON) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, - $"No payload for Operation input argument or content type is not JSON."); - return; - } - - // de-serialize SubmodelElement - try - { - // serialize - var input = Newtonsoft.Json.JsonConvert.DeserializeObject>(context.Request.Payload); - - // set inputs - if (input != null && input.Count > 0) - { - numGivenInputArgs = input.Count; - for (int i = 0; i < numGivenInputArgs; i++) - inputArguments[i] = input[i]; - } - } - catch (Exception ex) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, $"Cannot deserialize payload: {ex.Message}."); - return; - } - } - - // do a check - if (numExpectedInputArgs != numGivenInputArgs) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, - $"Number of input arguments in payload does not fit expected input arguments of Operation."); - return; - } - - // just a test - if (smep.HasQualifierOfType("DEMO") != null) - { - for (int i = 0; i < Math.Min(numExpectedInputArgs, numExpectedOutputArgs); i++) - outputArguments[i] = "CALC on " + inputArguments[i]; - } - - // return as little dynamic object - SendJsonResponse(context, outputArguments); - } - - public void EvalGetAllCds(IHttpContext context, string aasid) - { - // access the AAS - var aas = this.FindAAS(aasid, context.Request.QueryString, context.Request.RawUrl); - if (aas == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, $"No AAS with idShort '{aasid}' found."); - return; - } - - // build a list of results - var res = new List(); - - // create a new, filtered AasEnv - // (this is expensive, but delivers us with a list of CDs which are in relation to the respective AAS) - var copyenv = AdminShell.AdministrationShellEnv.CreateFromExistingEnv( - this.Package.AasEnv, filterForAas: new List(new[] { aas })); - - // get all CDs and describe them - foreach (var cd in copyenv.ConceptDescriptions) - { - // describe - dynamic o = new ExpandoObject(); - o.idShort = cd.idShort; - o.shortName = cd.GetDefaultShortName(); - o.identification = cd.identification; - o.isCaseOf = cd.IsCaseOf; - - // add - res.Add(o); - } - - // return as JSON - SendJsonResponse(context, res); - } - - public void EvalGetCdContents(IHttpContext context, string aasid, string cdid) - { - // access AAS and CD - var aas = this.FindAAS(aasid, context.Request.QueryString, context.Request.RawUrl); - var cd = this.FindCdWithoutAas(aas, cdid, context.Request.QueryString, context.Request.RawUrl); - if (cd == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, - $"No AAS '{aasid}' or no ConceptDescription with id '{cdid}' found."); - return; - } - - // return as JSON - SendJsonResponse(context, cd); - } - - public void EvalDeleteSpecificCd(IHttpContext context, string aasid, string cdid) - { - // access AAS and CD - var aas = this.FindAAS(aasid, context.Request.QueryString, context.Request.RawUrl); - var cd = this.FindCdWithoutAas(aas, cdid, context.Request.QueryString, context.Request.RawUrl); - if (cd == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, - $"No AAS '{aasid}' or no ConceptDescription with id '{cdid}' found."); - return; - } - - // delete ?! - var deleted = false; - if (this.Package != null && this.Package.AasEnv != null && - this.Package.AasEnv.ConceptDescriptions.Contains(cd)) - { - this.Package.AasEnv.ConceptDescriptions.Remove(cd); - deleted = true; - } - - // return as JSON - SendTextResponse(context, "OK" + (!deleted ? " (but nothing deleted)" : "")); - } - - #endregion - - #region // GET + POST handles/identification - - public void EvalGetHandlesIdentification(IHttpContext context) - { - // get the list - var res = IdRefHandleStore.FindAll(); - - // return this list - SendJsonResponse(context, res); - } - - public void EvalPostHandlesIdentification(IHttpContext context) - { - // first check - if (context.Request.Payload == null || context.Request.ContentType != ContentType.JSON) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, $"No payload or content type is not JSON."); - return; - } - - // list of Identification - List ids = null; - try - { - ids = Newtonsoft.Json.JsonConvert.DeserializeObject>( - context.Request.Payload); - } - catch (Exception ex) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, $"Cannot deserialize payload: {ex.Message}."); - return; - } - if (ids == null || ids.Count < 1) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, $"No Identification entities in payload."); - return; - } - - // turn these list into a list of Handles - var res = new List(); - foreach (var id in ids) - { - var h = new AasxHttpHandleIdentification(id); - IdRefHandleStore.Add(h); - res.Add(h); - } - - // return this list - SendJsonResponse(context, res); - } - - #endregion - - #region // Server profile .. - - public void EvalGetServerProfile(IHttpContext context) - { - // get the list - dynamic res = new ExpandoObject(); - var capabilities = new List(new ulong[]{ - 80,81,82,10,11,12,13,15,16,20,21,30,31,40,41,42,43,50,51,52,53,54,55,56,57,58,59,60,61,70,71,72,73 - }); - res.apiversion = 1; - res.capabilities = capabilities; - - // return this list - SendJsonResponse(context, res); - } - - #endregion - - #region // Concept Descriptions - - public void EvalPutCd(IHttpContext context, string aasid) - { - // first check - if (context.Request.Payload == null || context.Request.ContentType != ContentType.JSON) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, $"No payload or content type is not JSON."); - return; - } - - // access the AAS - var aas = this.FindAAS(aasid, context.Request.QueryString, context.Request.RawUrl); - if (aas == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotFound, $"No AAS with idShort '{aasid}' found."); - return; - } - - // de-serialize CD - AdminShell.ConceptDescription cd = null; - try - { - cd = Newtonsoft.Json.JsonConvert.DeserializeObject( - context.Request.Payload); - } - catch (Exception ex) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, $"Cannot deserialize payload: {ex.Message}."); - return; - } - - // need id for idempotent behaviour - if (cd.identification == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.BadRequest, - $"Identification of entity is (null); PUT cannot be performed."); - return; - } - - // datastructure update - if (this.Package == null || this.Package.AasEnv == null || this.Package.AasEnv.Assets == null) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.InternalServerError, $"Error accessing internal data structures."); - return; - } - - // add Submodel - context.Server.Logger.Debug( - $"Adding ConceptDescription with idShort {cd.idShort ?? "--"} and " + - $"id {cd.identification.ToString()}"); - var existingCd = this.Package.AasEnv.FindConceptDescription(cd.identification); - if (existingCd != null) - this.Package.AasEnv.ConceptDescriptions.Remove(existingCd); - this.Package.AasEnv.ConceptDescriptions.Add(cd); - - // simple OK - SendTextResponse(context, "OK" + ((existingCd != null) ? " (updated)" : " (new)")); - } - - #endregion - } -} diff --git a/src/AasxRestServerLibrary/AasxHttpHandleStore.cs b/src/AasxRestServerLibrary/AasxHttpHandleStore.cs deleted file mode 100644 index 271c92065..000000000 --- a/src/AasxRestServerLibrary/AasxHttpHandleStore.cs +++ /dev/null @@ -1,114 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo AG & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using AasxCompatibilityModels; -using AdminShellNS; -using Newtonsoft.Json; - -/* -Please notice: -The API and REST routes implemented in this version of the source code are not specified and standardised by the -specification Details of the Administration Shell. The hereby stated approach is solely the opinion of its author(s). -*/ - -namespace AasxRestServerLibrary -{ - /// - /// Describes a handle to a Identification or Reference to be used in HTTP REST APIs - /// - public abstract class AasxHttpHandle - { - [JsonProperty(PropertyName = "key")] - public string Key; - [JsonIgnore] - public DateTime ExpiresInternal; - [JsonProperty(PropertyName = "expires")] - // http-date, see https://stackoverflow.com/questions/21120882/the-date-time-format-used-in-http-headers - public string Expires; - } - - /// - /// Describes a handle to a Identification to be used in HTTP REST APIs - /// - public class AasxHttpHandleIdentification : AasxHttpHandle - { - private static int counter = 1; - - public AdminShell.Identification identification = null; - - public AasxHttpHandleIdentification(AdminShell.Identification src, string keyPreset = null) - { - if (keyPreset == null) - this.Key = $"@ID{counter++:00000000}"; - else - this.Key = keyPreset; - this.ExpiresInternal = DateTime.UtcNow.AddMinutes(60); - this.Expires = this.ExpiresInternal.ToString("R"); - this.identification = new AdminShell.Identification(src); - } - } - - /// - /// This store stores AasxHttpHandle items in order to provide 'shortcuts' to AAS Identifications and - /// References in HTTP REST APIs - /// - public class AasxHttpHandleStore - { - private Dictionary storeItems = new Dictionary(); - - public void Add(AasxHttpHandle handle) - { - if (handle == null) - return; - storeItems.Add(handle.Key, handle); - } - - public AasxHttpHandle Resolve(string Key) - { - if (storeItems.ContainsKey(Key)) - return storeItems[Key]; - return null; - } - - public T ResolveSpecific(string Key, List specialHandles = null) where T : AasxHttpHandle - { - // trivial - if (Key == null) - return null; - Key = Key.Trim(); - if (Key == "" || !Key.StartsWith("@")) - return null; - - // search in specialHandles - if (specialHandles != null) - foreach (var sh in specialHandles) - if (sh.Key.Trim().ToLower() == Key.Trim().ToLower()) - return sh; - - // search in store - if (storeItems.ContainsKey(Key)) - return storeItems[Key] as T; - return null; - } - - public List FindAll() where T : class - { - var res = new List(); - foreach (var x in storeItems.Values) - if (x is T) - res.Add(x as T); - return res; - } - } -} diff --git a/src/AasxRestServerLibrary/AasxRestClient.cs b/src/AasxRestServerLibrary/AasxRestClient.cs deleted file mode 100644 index 6cf3b0f42..000000000 --- a/src/AasxRestServerLibrary/AasxRestClient.cs +++ /dev/null @@ -1,202 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo AG & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Net; -using System.Net.Http; -using System.Text; -using System.Threading.Tasks; -using AasxIntegrationBase; -using AdminShellNS; -using Grapevine.Client; -using Newtonsoft.Json.Linq; - -namespace AasxRestServerLibrary -{ - public class AasxRestClient : IAasxOnlineConnection - { - // Instance management - - private Uri uri = null; - private RestClient client = null; - private WebProxy proxy = null; - - public AasxRestClient(string hostpart) - { - this.uri = new Uri(hostpart.TrimEnd('/')); - this.client = new RestClient(); - this.client.Host = this.uri.Host; - this.client.Port = this.uri.Port; - if (File.Exists("C:\\dat\\proxy.dat")) - { - string proxyAddress = ""; - string username = ""; - string password = ""; - try - { // Open the text file using a stream reader. - using (StreamReader sr = new StreamReader("C:\\dat\\proxy.dat")) - { - proxyAddress = sr.ReadLine(); - username = sr.ReadLine(); - password = sr.ReadLine(); - } - } - catch (IOException e) - { - Console.WriteLine("The file C:\\dat\\proxy.dat could not be read:"); - Console.WriteLine(e.Message); - } - this.proxy = new WebProxy(); - Uri newUri = new Uri(proxyAddress); - this.proxy.Address = newUri; - this.proxy.Credentials = new NetworkCredential(username, password); - } - } - - // interface - - public bool IsValid() { return this.uri != null; } // assume validity - public bool IsConnected() { return true; } // always, as there is no open connection by principle - public string GetInfo() { return uri.ToString(); } - - public Stream GetThumbnailStream() - { - var request = new RestRequest("/aas/id/thumbnail"); - if (this.proxy != null) - request.Proxy = this.proxy; - var response = client.Execute(request); - if (response.StatusCode != Grapevine.Shared.HttpStatusCode.Ok) - throw new Exception( - $"REST {response.ResponseUri} response {response.StatusCode} with {response.StatusDescription}"); - - // Note: the normal response.GetContent() internally reads ContentStream as a string and - // screws up binary data. - // Necessary to access the real implementing object - var rr = response as RestResponse; - if (rr != null) - { - return rr.Advanced.GetResponseStream(); - } - return null; - } - - public string ReloadPropertyValue() - { - return ""; - } - - // utilities - - string BuildUriQueryPartId(string tag, AdminShell.Identifiable entity) - { - if (entity == null || entity.identification == null) - return ""; - var res = ""; - if (tag != null) - res += tag.Trim() + "="; - res += entity.identification.idType.Trim() + "," + entity.identification.id.Trim(); - return res; - } - - string BuildUriQueryString(params string[] parts) - { - if (parts == null) - return ""; - var res = "?"; - foreach (var p in parts) - { - if (res.Length > 1) - res += "&"; - res += p; - } - return res; - } - - // individual functions - - public AdminShellPackageEnv OpenPackageByAasEnv() - { - var request = new RestRequest("/aas/id/aasenv"); - if (this.proxy != null) - request.Proxy = this.proxy; - var respose = client.Execute(request); - if (respose.StatusCode != Grapevine.Shared.HttpStatusCode.Ok) - throw new Exception( - $"REST {respose.ResponseUri} response {respose.StatusCode} with {respose.StatusDescription}"); - var res = new AdminShellPackageEnv(); - res.LoadFromAasEnvString(respose.GetContent()); - return res; - } - - public string GetSubmodel(string name) - { - string fullname = "/aas/id/submodels/" + name + "/complete"; - var request = new RestRequest(fullname); - if (this.proxy != null) - request.Proxy = this.proxy; - var response = client.Execute(request); - if (response.StatusCode != Grapevine.Shared.HttpStatusCode.Ok) - throw new Exception( - $"REST {response.ResponseUri} response {response.StatusCode} with {response.StatusDescription}"); - return response.GetContent(); - } - - public async void PutSubmodelAsync(string payload) - { - string fullname = "/aas/id/submodels/"; - - var handler = new HttpClientHandler(); - handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials; - handler.AllowAutoRedirect = false; - - var hClient = new HttpClient(handler) - { - BaseAddress = uri - }; - StringContent queryString = new StringContent(payload); - await hClient.PutAsync(fullname, queryString); - } - - public string UpdatePropertyValue( - AdminShell.AdministrationShellEnv env, AdminShell.Submodel submodel, AdminShell.SubmodelElement sme) - { - // trivial fails - if (env == null || sme == null) - return null; - - // need AAS, indirect - var aas = env.FindAASwithSubmodel(submodel.identification); - if (aas == null) - return null; - - // build path - var aasId = aas.idShort; - var submodelId = submodel.idShort; - var elementId = sme.CollectIdShortByParent(); - var reqpath = "./aas/" + aasId + "/submodels/" + submodelId + "/elements/" + elementId + "/property"; - - // request - var request = new RestRequest(reqpath); - if (this.proxy != null) - request.Proxy = this.proxy; - var respose = client.Execute(request); - if (respose.StatusCode != Grapevine.Shared.HttpStatusCode.Ok) - throw new Exception( - $"REST {respose.ResponseUri} response {respose.StatusCode} with {respose.StatusDescription}"); - - var json = respose.GetContent(); - var parsed = JObject.Parse(json); - var value = parsed.SelectToken("value").Value(); - return value; - } - } -} diff --git a/src/AasxRestServerLibrary/AasxRestServer.cs b/src/AasxRestServerLibrary/AasxRestServer.cs deleted file mode 100644 index 244e24a9c..000000000 --- a/src/AasxRestServerLibrary/AasxRestServer.cs +++ /dev/null @@ -1,418 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo AG & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using AdminShellNS; -using Grapevine.Interfaces.Server; -using Grapevine.Interfaces.Shared; -using Grapevine.Server; -using Grapevine.Server.Attributes; -using Grapevine.Shared; -using Newtonsoft.Json; - -/* -Please notice: -The API and REST routes implemented in this version of the source code are not specified and standardised by the -specification Details of the Administration Shell. The hereby stated approach is solely the opinion of its author(s). -*/ - -// ReSharper disable ClassNeverInstantiated.Global -//.. motivation: unsure what happens to reflection, when making class static .. - -namespace AasxRestServerLibrary -{ - public class AasxRestServer - { - [RestResource] - public class TestResource - { - public static AasxHttpContextHelper helper = null; - - // Basic AAS + Asset - - [RestRoute( - HttpMethod = HttpMethod.GET, - PathInfo = "^/aas/(id|([^/]+))(|/core|/complete|/thumbnail|/aasenv)(/|)$")] - public IHttpContext GetAasAndAsset(IHttpContext context) - { - var m = helper.PathInfoRegexMatch(MethodBase.GetCurrentMethod(), context.Request.PathInfo); - if (m.Success && m.Groups.Count >= 2) - { - if (helper.PathEndsWith(context, "thumbnail")) - { - helper.EvalGetAasThumbnail(context, m.Groups[1].ToString()); - } - else - if (helper.PathEndsWith(context, "aasenv")) - { - helper.EvalGetAasEnv(context, m.Groups[1].ToString()); - } - else - { - var complete = helper.PathEndsWith(context, "complete"); - helper.EvalGetAasAndAsset(context, m.Groups[1].ToString(), complete: complete); - } - } - return context; - } - - [RestRoute(HttpMethod = HttpMethod.PUT, PathInfo = "^/aas(/|)$")] - public IHttpContext PutAas(IHttpContext context) - { - helper.EvalPutAas(context); - return context; - } - - [RestRoute(HttpMethod = HttpMethod.DELETE, PathInfo = "^/aas/([^/]+)(/|)$")] - public IHttpContext DeleteAasAndAsset(IHttpContext context) - { - var m = helper.PathInfoRegexMatch(MethodBase.GetCurrentMethod(), context.Request.PathInfo); - if (m.Success && m.Groups.Count >= 2) - { - helper.EvalDeleteAasAndAsset(context, m.Groups[1].ToString(), deleteAsset: true); - } - return context; - } - - // Handles - - [RestRoute(HttpMethod = HttpMethod.GET, PathInfo = "^/handles/identification(/|)$")] - public IHttpContext GetHandlesIdentification(IHttpContext context) - { - helper.EvalGetHandlesIdentification(context); - return context; - } - - [RestRoute(HttpMethod = HttpMethod.POST, PathInfo = "^/handles/identification(/|)$")] - public IHttpContext PostHandlesIdentification(IHttpContext context) - { - helper.EvalPostHandlesIdentification(context); - return context; - } - - // Server - - [RestRoute(HttpMethod = HttpMethod.GET, PathInfo = "^/server/profile(/|)$")] - public IHttpContext GetServerProfile(IHttpContext context) - { - helper.EvalGetServerProfile(context); - return context; - } - - // Assets - - [RestRoute(HttpMethod = HttpMethod.GET, PathInfo = "^/assets/([^/]+)(/|)$")] - public IHttpContext GetAssets(IHttpContext context) - { - var m = helper.PathInfoRegexMatch(MethodBase.GetCurrentMethod(), context.Request.PathInfo); - if (m.Success && m.Groups.Count >= 2) - { - helper.EvalGetAssetLinks(context, m.Groups[1].ToString()); - } - return context; - } - - [RestRoute(HttpMethod = HttpMethod.PUT, PathInfo = "^/assets(/|)$")] - public IHttpContext PutAssets(IHttpContext context) - { - helper.EvalPutAsset(context); - return context; - } - - // List of Submodels - - [RestRoute(HttpMethod = HttpMethod.GET, PathInfo = "^/aas/(id|([^/]+))/submodels(/|)$")] - public IHttpContext GetSubmodels(IHttpContext context) - { - var m = helper.PathInfoRegexMatch(MethodBase.GetCurrentMethod(), context.Request.PathInfo); - if (m.Success && m.Groups.Count >= 2) - { - helper.EvalGetSubmodels(context, m.Groups[1].ToString()); - } - return context; - } - - [RestRoute(HttpMethod = HttpMethod.PUT, PathInfo = "^/aas/(id|([^/]+))/submodels(/|)$")] - public IHttpContext PutSubmodel(IHttpContext context) - { - var m = helper.PathInfoRegexMatch(MethodBase.GetCurrentMethod(), context.Request.PathInfo); - if (m.Success && m.Groups.Count >= 2) - { - helper.EvalPutSubmodel(context, m.Groups[1].ToString()); - } - return context; - } - - [RestRoute(HttpMethod = HttpMethod.DELETE, PathInfo = "^/aas/(id|([^/]+))/submodels/([^/]+)(/|)$")] - public IHttpContext DeleteSubmodel(IHttpContext context) - { - var m = helper.PathInfoRegexMatch(MethodBase.GetCurrentMethod(), context.Request.PathInfo); - if (m.Success && m.Groups.Count >= 4) - { - helper.EvalDeleteSubmodel(context, m.Groups[1].ToString(), m.Groups[3].ToString()); - } - return context; - } - - // Contents of a Submodel - - [RestRoute( - HttpMethod = HttpMethod.GET, - PathInfo = "^/aas/(id|([^/]+))/submodels/([^/]+)(|/core|/deep|/complete)(/|)$")] - public IHttpContext GetSubmodelContents(IHttpContext context) - { - var m = helper.PathInfoRegexMatch(MethodBase.GetCurrentMethod(), context.Request.PathInfo); - if (m.Success && m.Groups.Count >= 4) - { - var deep = helper.PathEndsWith(context, "deep"); - var complete = helper.PathEndsWith(context, "complete"); - helper.EvalGetSubmodelContents( - context, m.Groups[1].ToString(), m.Groups[3].ToString(), - deep: deep || complete, complete: complete); - } - return context; - } - - [RestRoute(HttpMethod = HttpMethod.GET, PathInfo = "^/aas/(id|([^/]+))/submodels/([^/]+)/table(/|)$")] - public IHttpContext GetSubmodelContentsAsTable(IHttpContext context) - { - var m = helper.PathInfoRegexMatch(MethodBase.GetCurrentMethod(), context.Request.PathInfo); - if (m.Success && m.Groups.Count >= 4) - { - helper.EvalGetSubmodelContentsAsTable(context, m.Groups[1].ToString(), m.Groups[3].ToString()); - } - return context; - } - - // Contents of SubmodelElements - - [RestRoute( - HttpMethod = HttpMethod.GET, - PathInfo = "^/aas/(id|([^/]+))/submodels/([^/]+)/elements(/([^/]+)){1,99}?" + - "(|/core|/complete|/deep|/file|/blob|/events|/property)(/|)$")] - public IHttpContext GetSubmodelElementsContents(IHttpContext context) - { - var m = helper.PathInfoRegexMatch(MethodBase.GetCurrentMethod(), context.Request.PathInfo); - if (m.Success && m.Groups.Count >= 6 && m.Groups[5].Captures.Count >= 1) - { - var aasid = m.Groups[1].ToString(); - var smid = m.Groups[3].ToString(); - var elemids = new List(); - for (int i = 0; i < m.Groups[5].Captures.Count; i++) - elemids.Add(m.Groups[5].Captures[i].ToString()); - - // special case?? - if (helper.PathEndsWith(context, "file")) - { - helper.EvalGetSubmodelElementsFile(context, aasid, smid, elemids.ToArray()); - } - else - if (helper.PathEndsWith(context, "blob")) - { - helper.EvalGetSubmodelElementsBlob(context, aasid, smid, elemids.ToArray()); - } - else - if (helper.PathEndsWith(context, "property")) - { - helper.EvalGetSubmodelElementsProperty(context, aasid, smid, elemids.ToArray()); - } - else - if (helper.PathEndsWith(context, "events")) - { - context.Response.SendResponse( - Grapevine.Shared.HttpStatusCode.NotImplemented, $"Events currently not implented."); - } - else - { - // more options - bool complete = false, deep = false; - if (helper.PathEndsWith(context, "deep")) - deep = true; - if (helper.PathEndsWith(context, "complete")) - { - deep = true; - complete = true; - } - - helper.EvalGetSubmodelElementContents(context, aasid, smid, elemids.ToArray(), deep, complete); - } - } - return context; - } - - [RestRoute( - HttpMethod = HttpMethod.POST, - PathInfo = "^/aas/(id|([^/]+))/submodels/([^/]+)/elements(/([^/]+)){1,99}?/invoke(/|)$")] - public IHttpContext PostSubmodelElementsContents(IHttpContext context) - { - var m = helper.PathInfoRegexMatch(MethodBase.GetCurrentMethod(), context.Request.PathInfo); - if (m.Success && m.Groups.Count >= 6 && m.Groups[5].Captures.Count >= 1) - { - var aasid = m.Groups[1].ToString(); - var smid = m.Groups[3].ToString(); - var elemids = new List(); - for (int i = 0; i < m.Groups[5].Captures.Count; i++) - elemids.Add(m.Groups[5].Captures[i].ToString()); - - // special case?? - if (helper.PathEndsWith(context, "invoke")) - { - helper.EvalInvokeSubmodelElementOperation(context, aasid, smid, elemids.ToArray()); - } - } - return context; - } - - [RestRoute( - HttpMethod = HttpMethod.PUT, - PathInfo = "^/aas/(id|([^/]+))/submodels/([^/]+)/elements(/([^/]+)){0,99}?(/|)$")] - public IHttpContext PutSubmodelElementsContents(IHttpContext context) - { - var m = helper.PathInfoRegexMatch(MethodBase.GetCurrentMethod(), context.Request.PathInfo); - if (m.Success && m.Groups.Count >= 6) - { - var aasid = m.Groups[1].ToString(); - var smid = m.Groups[3].ToString(); - var elemids = new List(); - for (int i = 0; i < m.Groups[5].Captures.Count; i++) - elemids.Add(m.Groups[5].Captures[i].ToString()); - - helper.EvalPutSubmodelElementContents(context, aasid, smid, elemids.ToArray()); - } - return context; - } - - [RestRoute( - HttpMethod = HttpMethod.DELETE, - PathInfo = "^/aas/(id|([^/]+))/submodels/([^/]+)/elements(/([^/]+)){0,99}?(/|)$")] - public IHttpContext DeleteSubmodelElementsContents(IHttpContext context) - { - var m = helper.PathInfoRegexMatch(MethodBase.GetCurrentMethod(), context.Request.PathInfo); - if (m.Success && m.Groups.Count >= 6) - { - var aasid = m.Groups[1].ToString(); - var smid = m.Groups[3].ToString(); - var elemids = new List(); - for (int i = 0; i < m.Groups[5].Captures.Count; i++) - elemids.Add(m.Groups[5].Captures[i].ToString()); - - helper.EvalDeleteSubmodelElementContents(context, aasid, smid, elemids.ToArray()); - } - return context; - } - - // concept descriptions - - [RestRoute(HttpMethod = HttpMethod.GET, PathInfo = "^/aas/(id|([^/]+))/cds(/|)$")] - public IHttpContext GetCds(IHttpContext context) - { - var m = helper.PathInfoRegexMatch(MethodBase.GetCurrentMethod(), context.Request.PathInfo); - if (m.Success && m.Groups.Count >= 2) - { - helper.EvalGetAllCds(context, m.Groups[1].ToString()); - } - return context; - } - - [RestRoute(HttpMethod = HttpMethod.PUT, PathInfo = "^/aas/(id|([^/]+))/cds(/|)$")] - public IHttpContext PutConceptDescription(IHttpContext context) - { - var m = helper.PathInfoRegexMatch(MethodBase.GetCurrentMethod(), context.Request.PathInfo); - if (m.Success && m.Groups.Count >= 2) - { - helper.EvalPutCd(context, m.Groups[1].ToString()); - } - return context; - } - - [RestRoute(HttpMethod = HttpMethod.GET, PathInfo = "^/aas/(id|([^/]+))/cds/([^/]+)(/|)$")] - public IHttpContext GetSpecificCd(IHttpContext context) - { - var m = helper.PathInfoRegexMatch(MethodBase.GetCurrentMethod(), context.Request.PathInfo); - if (m.Success && m.Groups.Count >= 4) - { - helper.EvalGetCdContents(context, m.Groups[1].ToString(), m.Groups[3].ToString()); - } - return context; - } - - [RestRoute(HttpMethod = HttpMethod.DELETE, PathInfo = "^/aas/(id|([^/]+))/cds/([^/]+)(/|)$")] - public IHttpContext DeleteSpecificCd(IHttpContext context) - { - var m = helper.PathInfoRegexMatch(MethodBase.GetCurrentMethod(), context.Request.PathInfo); - if (m.Success && m.Groups.Count >= 4) - { - helper.EvalDeleteSpecificCd(context, m.Groups[1].ToString(), m.Groups[3].ToString()); - } - return context; - } - - } - - private static RestServer startedRestServer = null; - - public static void Start( - AdminShellPackageEnv package, string host, string port, GrapevineLoggerSuper logger = null) - { - // if running, stop old server - Stop(); - - var helper = new AasxHttpContextHelper(); - helper.Package = package; - TestResource.helper = helper; - - var serverSettings = new ServerSettings(); - serverSettings.Host = host; - serverSettings.Port = port; - - if (logger != null) - logger.Warn( - "Please notice: the API and REST routes implemented in this version " + - "of the source code are not specified and standardised by the" + - "specification Details of the Administration Shell. " + - "The hereby stated approach is solely the opinion of its author(s)."); - - startedRestServer = new RestServer(serverSettings); - { - if (logger != null) - startedRestServer.Logger = logger; - startedRestServer.Start(); - } - - // tail of the messages, again - if (logger != null) - logger.Warn( - "Please notice: the API and REST routes implemented in this version " + - "of the source code are not specified and standardised by the" + - "specification Details of the Administration Shell. " + - "The hereby stated approach is solely the opinion of its author(s)."); - } - - public static void Stop() - { - if (startedRestServer != null) - try - { - startedRestServer.Stop(); - startedRestServer = null; - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); - } - } - } -} diff --git a/src/AasxRestServerLibrary/AasxRestServerLibrary.csproj b/src/AasxRestServerLibrary/AasxRestServerLibrary.csproj deleted file mode 100644 index 7e653816d..000000000 --- a/src/AasxRestServerLibrary/AasxRestServerLibrary.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - net6.0 - Library - false - false - - - - - - - - - diff --git a/src/AasxRestServerLibrary/Docs/REST_routes.xlsx b/src/AasxRestServerLibrary/Docs/REST_routes.xlsx deleted file mode 100644 index b3fd53dd245df8b6c0e5546435d5142744cf107b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156220 zcmeFXgOeytmp<6G&D*wZ+qP}nwr%US-F@4}ZQHhOZol8m?##w~yZ^xaG9s%YBdaPh zv!3Ui^PEh1DPRy305AXu00002fK*Cc?kqq6fEF+S0Av6NAT1#~TW1qnXFX*PdlM%e zT6Y_3{6Y{Q@_YcGpXdKi`Cq&OgDNs|zyt_gSuc33+A?WpeHioA;C!)`g}y6uoQ3W*Bxi7*Aui!N9%e|2wc&nBR7G=2i-DaOaC9Yb zxxMrLjG-8DSNes#I4aLfy1L{Zt-8vsQBD~Zh?Jsc&4g%_d|j_1j1Wl?i~50ICz$QS z>HL@%0KeT_q*F2Hp%EMm$qz)QPS*9ZTc$Jb-;TmT;GUD(9tw^|6QNvL_b{^_!G*S7 z*TYOUkoEK%z$(mAP81$5QnNW;QRg0bf-SmmjrEwK%3W%!^iH?>_27!A^X`eD|GuK` z@VIDyB*E>S0cZ>lRFl(lA&F&j^&08<0d5X$l!F|F{JB~yf_{nU5(<+zqmqgr|GV2w z7vOqhdH7&6LgHwAzx-$Yr45p|3?bp&I`9*;N>e%ZmoQkMFxrxgrBZz@W}5_FHp78h zum5T<&3Gl#*AHvIzkvbd|6iPLR-q?)_yMZ)4`rc$IIZVsV(mmn`_J|NaQS~Rf&bgo zs}g182Iyfzuf;#YMxPfq;}Ha<+yuls2$X&OB{txjV~U8eH+#r%5R|ckfW`c}d_Tt4 zH@RcZMhTwwn5&|YP`HR%+^R#<-W*)ODM=kuMIEYk2N7Kt9~Yl8#3Vh)UAy8aEC2j1 zkovn#Bsza9T#qnKtA+)MT!Isd#*-1CIV_{GW%yD9xG1P}Sshx}%9ekYG@a$QoLYJc z%NNceeKD7TI_hL-wp!yoYEAI?ilw4t&S6n!nCr+%=%Ht9-Fq*b)r0)$O(UBc8QR%d{p0%nZ_WVz_`jcL|96+pBsr-;dW50tz-@ww&C=@jaO-w(k(J6C zJpAJMQtPbbiI=kNE%|yEgYvXJhpqT$Uv9?rO|#`lH<$(YGJGjTgp+7GY&9x(9&Vk@ z0Q{wzg=)9o`uu@94j%PB!>Uf+!Y!u~!sud9)J}eMB$!b-rGw8Wd!=^;^Ee~&(1}8>$+gsfgSV3`Hoh~OY(!mF#A+z#fSQ>rozEK)T z0s^^aqszuGH@o6!31+bpgdDbaBUPNI^7k>%4an z==@FNkv$-fOjR&`t-0IJhm|;dMWm6jseAuhB*}%Os3-rRNa!b`g8zZY50d^nhN@Jo z?26b?KD+0>z@x5Fvds8p#0cPRO0H~^O-;Lnu{iVtQG2TxWGXDb-gUX+N-v`qF0GR> z>h|}Yu6UjuKP~jsP6GbMMwyx?P+1c!8515)nwtCQPF)0qaEfGQs}>pvohP^~m1S-F zb!tKAIlJJoXGvM_Ze~(w1*ktlRf_{#5Ohi1 zu*D)cZ3kNQLdx$7wu9gcG_aQ=>zm6evdop3jS$oUY;wZ?6y@uKBcKzk^TQ5$CU}iC zhSxs6nUD;{Ge*s=?>D0l^uvttZ;n<&g4hC|4P;_lZf~P?AL_=biZWmS60yoD9}`5q zTwp$qJQSh|6stF)BQ@SG<*C(Q97+hIIX<#JZWHF9GS@37!FUCMPeBZ=$3F23WDrd; zY$%9~5h>~o6VvHA;|SuR1!c#fS>fYJgMotn0M#@o)(~9Y%&tIsY{1goH-2mbeyz+* zGh{K?RE=y%-_ zr3WW;m3R5$hs%RNmXzdoEJ^sMCuc(d?)nti7{xmY5BdvDQMA)eh7|ek5^{toZep%i zR?NZp{Wf}~XaRdY7hRb6F)%*5^BP|?RD#sJcC1K)`C;a+sY{RUQ{uS{H83gnc$zu) z=GN%^ymGhcNe6n#<`&wl<7!p)4e_$)juf4%=;YQJepQ5v={x1PVj=axDBe5$J?K^j z(wGR{Iub>P&bbm>^9$e&eiFq`U#dMc-<+m~l)EYSgB&BeG{7vbUd-Ar-qSS_vc(6f ztsFhXI8ik8w^QH3gNeR%&2NV0rt~ekS-}UWOkPH4Qb4rC2ww56BjNL|jXO7my3hiT zZEMty6%gm?EbaZs`2fsn#^0Pi3?~eIwpHJKPiHksM^K^1_|Y%!D7!1Iw+qnx>KALk z+fJADd=6y-%sJBY{AAia35nlDbXo0EvbCI(4aJHyBn#-B_~=#Q7T|C!3ikfjB&*CA z#Vf#(U(plzPYf;d%nz6PjPqaF(Pe!X8C9uz-gQ)PIE`5fi$Wtall|Oep4qr&(@8@H zd+EFAL)p}%q)dDpzVT&ZNhrrC$yt8?mcTT!MkuEsKjg&$0D%1u0y{Z-SerQg;{p~m zHtqJ<5&Za0zrseZnem931%ek9u`Eiq$`!rZy;vfERddpvq}eV`zn-zVAcHRj3#26D z!dP7|GPb=vNq_lJGMRECE6C@DjdnN03*4oXG3SMy#EtwuCMt?&m!se3fSk=lIhlW1 z))NiUX1c4x7slczq!Vn4cjRE6B-D+EL09vZaCA>{OfY~HVql9Z!DpvfD2>jDHG!Rg zna5E<3Dxk1Nq~teTWmnTw~ipmQ4l@UoEH>DgYTJeqP>X*T$popuugvBXBVZwBK3R% z&5IrmMCVRX<6l0okTkkOvegG8jcrZ#zgs6?&9&g*YDn9QN!C`1H>;Qk8!k#dZlE{p z9y19C0;o`?_a1v)=2ooj?SHJe{rzIfZ3M=|$~aP#&O{3XSqeOPnt@|htmzPhnFCpo zTEbprts}!_DX7(?uW>kdmxl$Jg%h|)J5xXls5wWaST z_)q~s+XRNDj)G9Kwz6i*b)AAw1Wlk^3?nM*?YNOQ;FN<1+sOBVBPQ}lhfRh_VgA#cNQNQ%&<=wU|2%|h!ehO zX~}I!oDzQynnSnX_c!gvZMY;j(2QG>Jog@l$;Fe6D|Q94nIJiUU`$+44b#4|VfT4g zul|)GEfd#24$=rda!cUL}4*4Zrl8x4YFhnSi(q!DscY9S+|rg?Z};#irKxTmqK*$aNicimFT9P$^L+y{c3lj^wD;Lq&rB_T z5x-0lWut0Me)BiYoGaP9j#C8KM-ygYH)cP}J-FiRYVsg>=8E0>$FR*(otiYh6DzEQ zCc)J1cCr;0eAH1sGzp-@? z^CKVsO?aHK@Fe!}qaSIZ001!lE2wcYH!*Q`qWjm4@gMV;ovLG(MUN7CO?JtLzfGo( zl;|&5L8;NKE1kLIqs?^`uMRq4O=iJ%*>jDN8eD@fP=tSbdzWqW@e7a6F86MNBXCX- zjiJCOj$Ph9Bis-@$xiQD6nf8mATrpb!9Sflh?K4J`8t)X{MX~JUUqSEXX&Tm|mI}1NrON4`<$9wuo?Sdz1>EGLw zoe?CYeZ6)GZ#wmP)?S=>GN(G>i$wTON1=~)i64UWd2het7a0-R2V9k71DQ!%ncGVU z9Ms0g__sl`o%c5wtlt4J?SV0Zkw)H}s1A!zxAtk^6WWo~iT6cu3}7`({{nh`9QTk1 z!0zfAGEYz6UQx>VsZOO@sE=QSiBJ3rGQ1>?ZxAx=9-S9M=;-R}fT)#5BALdX!O@BO z8~sTsi)uOmqeYX#&2a)Sp`A9dgdB6z`8m0msC7vLg;45XJfgy`*Df}Zx*t#ljc{Dg zhcKkJQ-~Yxw2BwLM@4T9E*l1*;0>raZAG^Bdhv;;-!f)-=rTq%P9}4YmXqt}tk9xT4l$4i0`+ zAjRmPzNnM@z4|jSr#as9MaLCC*oGlAi!hN>{ADc{qqmMZ+yk$-xtIA^Ir`Dp zmDEg+uO5Wu$zt6@sg@u)=}X~)9GJNZ)E#n_O{&g%+l!I4!E)(w&%D_VVN-?|{n*Q6B&&@|?t!{9l7~8?*XzijdY~i(3?=CCZ`<2J~5@ ztd=f$GZpB%uAY@WKYaL~f|84W4D|CSzF-Ci03iAwjQJ03`7hou{6ETaB4yHcogQZ7 z8u$q=;JU$@%;BOymTukum+NXf_zv+J8l_Yw@$vqp81`ff7;GrOP<)n%0I}ak(!=Jb z!AunHTYi;ABKKq>D3(D9qfU~y-^WCSF(M%b^=ZNGaT$@(-J(w=?T{rKes?w=V(LXdyfzCIyx^pe1pVCQ1MHgm{`L1 z<$6ms(#ve513$7JWM4@bPeOv!4el_h#C#G>Ht$`sqU_80D)lyFR_>op)uU56US#8R zN{n*ZRA-Ck&9Z*DkK=HI8aBNY6P+c{?Euxph+o{{;!ungOi5!!;Y)ZKz<3!pn02$~ zue1-T(n`JdkuO7%l$T||U2OIVp7*H>Q&d8`-3HObL)X%#G*eeEs~mEEk4Jt!8wlV^ZolA}URDkHb`TQPA1|?XTUieY(SA zm6B+Mv9!sfqEUwQ)9$*QxvNYg+hHy6Mvf9L81x~1Q@-r7c3NJ?Jo~W!HN{7j_}z5y zUy?+9jzV#sQI*T_U_*g(v8QymHyp_5^NCF-w}0z$=&0{UyMLB|_`jCG*wMhv!q&{` zKT|XR+59g81;+_k0yDsfJcn%cnd@1VM#+!4H&6svOF046)aqJhNz;}r7w@xknKCt4kMhUKV| zL%7(xrs*qI<$5TtQZ_M{MUo<3oi}7e`Yw`t>w@8`?#ra_t6x#XBp+)F;?jO>`<0iI zN}~QH{)D8lh6e>x-@z3hd2GsW6@3Bpc~CU92Y3vL=bP2@Z&ipoINPc0kL~Ei|7R!W zUugtqa}ygAx_@2&HRlVB$tY|#lpgdqJ{Tvr50?EnlC7O->!eL$9FcF6`(QpD0dbi{*id#-39YJ7aP2Qc(q|h0`3bA!bwInW9&35w?@M#S-FggvRMk z`Fj5N)Q7h)5>T>@VmShTru{Vm+8>C_O_GCGO#&0ZSXiU_#Nt2XtkJt(errzQh2<|o ztYU5+TGFU>4uY}rpR0x2?DDMDY`F>jI?J5Al=q?T1S@$9V)@XY0j1M)hn2kD#p1nS z=Hk)n0V{b~!|K+xd=6|c(F-D!OdMcwrl?Zs7+H%ZGh z>_=*&ST=M{y9ES5i6@jmlA|?s4-}2>(GmU&NVY|rAsX+_luQpeP$Fp|U(xUP2>HN< ztI!mZKu~=FBsI7e-!OtqBx~Ams0Ucx4d`)uv3egSm&f;U`C244jrWx}S*@bs$VHx! z=~(Og@pgUPbMy7~7^W82BT>d1flm5$IIY+H@fo*V9)@~c<9>UYlqQ$g`Epgs=jVAb zvvqXR8w@WI9pVOy=f$Q01MR#L2mf+P9EwPo3KGfRD&(RkigvRGq<~%%WP`qS)XPY_ zbNH$=zVsPBP2w=&%@Rqo^UJ7d;Lkju+M;%7SlGSsS#I{U%!W*GthSSzf+6T1zC6G# zq_i>HU>YVn`DAhCA;{F+w-{W*3-wK0LF%5X1VpnynPRsvcU<9YTFgXXsszUZTqGfF zG+JPSg;cvITQ6Kuoyx0SB5cTYAce47A!!;mT~Vh9!?ZDi$nw)09b%%igm-9OMh71P zf;lDWjAc9{0&T`+j;dvdHx+#hx0UA;!j=T>M4_}Pox${oi~0fE;Ju7_(?ns?Cng67 zipWlE>GmD3i7kRN%sv0anB8ufI@BvR(=pvhfRz{eYKA%jt~C|MAkY`5?WQ?| zZV`2gu6S~*U|vsXWZ`B3i5RysnY987)e9j?QxYZ1rzbNYxRdKuB$Lv zmoyg(|3sb`#9`wWM3pea$3uMKT^G@ll$;1unJ`q?5?{;;6BM-?fO%Dg05w~9-32XQ zjAC44^I-uGUR4LltiR(Y6+77$#cUi&nV0}1PmI8K;%q6^*lA^|X{Bpg!fTBE;%w^> zM6g8eh*J&o)@^wvRaqY5H229=sT~AtMO!Zj^{T{A@Bq4s%nBW4fLD6K$+=-?uF^Gq!4~Q7Nhfv40njf2el8KW98}G9(D_r?b zzQ_WRA&(7?JLwRA*vZSbaFG8%Y9VUm`jNqvM!QZ{lIIAWvKKZ&n2<$E98qW|os8jp zHr)l>CRbzPv|sfHm2>KEzc2XQD^zov#hdz?YE~7>%CKel{t?=$qvR8&sZ=~$x?UhW zZa+#q$5+TH8^o5~Y-LA)nZNr>J)b;u&RoULh21Q}H4xZ)BWx42t!frLk9_TU7qs!W zN(Fqdp=KeXmTr7f%f{6neY6PtIn0SN1de1w!wE!0&l5Of4$L~ii?I@MH;e7K_;8yp zk`F- z<))|I%z0?c(N4fMu7&+fjcbr*kHYVij!i*%DvEpTNkN|9%4-5$n+^EyHS9aJ(8a!fewg{@e&5}^Z*O*?AGY3G z4^wgzF**T25 zj(Cvlw%`yJxqGbI+{@Jaa2`(y00Hx4Uq z7{&^5gnsBmq#Kprx>Mc8$KE;@-(6naoq{j?58TIetLtBhXxDMCSLf%TzAgq&6F#%J>$MN({9NYTkNUl;G{bQNPdiFO)s1aIlaoA z$ljKm8SL6D2-4}#0dg1nTx_L{55)%j8JFv?ia3K0D3EZH{&LAXt84-1oVq(w6_zFd zu~vY2K`hU8@ZM*s;#IaRI(S@tW$9Nj=X5q6Dv$Fa-0B*`jX|bkreQ8Gf^?Jvj&y6r zX&1XS)LUiwSxw3znd>wOqYrh_C?uE1g*`5DFYqHarK6PPR ziXy|hGM|j56jG_adqWy*7aXNJ_OCgq(jF}hUP$IBf{2cX zNh!pED@S8;Sxf<$f2JWe=iKm(gQ2+y+qEo*jvqs)LCx#4Qazf!x15*yTwgHy)v~{? zc7}NWOf`9eEd%ZPqk^o_ z=MyJ*D}|Jdbt0Nwg1)+YD+L zn<(iNra|M>7(~M4#oFLRc*5ny9JyHZ){LOe&>VANaIwVr=!d?2ZmbNLnhk|-X0Zsm zT%8y2vT$baA6f(u!x)IHX3=WmQPIcKuSi4VqBrBbSVW>%cf#cPtU9coHF+%!2Yq6B zpyEka2D9(MVDV7WjQBfJpDC6EoBY#JPtg_XTHM<&7D4=!1+D@idhEeEt3)ti)@ybD zruUi|H9MJ%UpiKk4ucUgGA6Q)?RY2rI>i?J59L)6!7_tLIP)-t>U%fA+feZnT?PY6fDgL=J}`{qtgIXloum~8)-UC0jSL!O_P4s zV}A0{g8rk;BGKu&F%A%*NQtC}jS4tqEPMfT`~^iadhax&9g7RYg&(L{j}GMgjyP-1 zL@4+qaOJ3=;@Dw=CN`|7iKXfZ^BcQq1voX@VX^Q&QI43OqNBUbkJeazD^*c^!Q_L< z;j8$f5qye-{NcPG!7Xc42n44_1Gka6sask_;xc2qngg&H4V8CH_#Y^wMy>tu909J_ z#v!yVYGb>{E!N@qBp>31GV(~3R;-{v4F#o!e5rTF@(4F?~B)zQTYNPZDmB!Z4Opj4(6!9dj0#`aTI@^C2bk~cM> zX?)^<5;TAYsd_g@F#~EmV;nxH*F_b{r&18hH0-d)8a_HE`$9K(uTa)Ml1Xe;Zylbv zXa-Mu#uD;NCKls}_#Y6T&RKy1&N-qKG_WQ?Nhno~UTwvYr#QU~N?Yow+3jv(QO$Wm zv!2tgArk5}bsVhu1z{W(Zk8}B`9F{jzQu0^cafw6Dlo)WuXH`80t)Gls9J|q%f})b zG}j0Z20-aSk+Um?URT2_YV2{a!P{>CsRvQVXs;%xXY z!wO{Y$iI_(bUeb`DwSHKuD$ddS+~{?aci5;Tgs6G2H6$k$Y9E^AS9CZEODF~_yRaM z_HET2+>O}Vmkk@I>>(78T+S~5l+JuKWCMbCd6(W>CgCidN=` z!YbWLt5Y@Im8=pqb)qRRx`GbL-Re%d`XRC&JJtP-buSRdIuP+Q(BB{4l>M8EC4W~D zsl*8;W>;I7-2IIBnhA1N3e-H&L3FlJOsv#w(E=LfFf3~)rBE@k388Ha)ww8Qw&(+G6Kh|Uh|8} zsKy0l4CwI?NzBCWVHk(isx?+Ju>Wgxkd<7tjYd{3N5#-{!x-Xypl>B6=ja2)VUr9n zQKez@LJ2VQfVAjjyNGDMhca)a+WQU?WwrpNencj@0*fY5SUc16c$!$-GX|q8uc^&o zr4U1>Gmd(e2(I+SU#6vw3{dgPc}5E0=PSTP7zar~Fp9HL)IyZ}N)L`Bv(j*Otf)u_ zh^*(1pn@oP`K^A4MKjWdTNn&)#smwCjtT@4W2kUCmY_~1nyw=X3UJ_*l*ja87khF* z#mTbfaLD-*zKmC_C6!1jhC4q7%XiLUAu@GGA)4Dm^F=6J+LfjuJVIVoi&YUs=NxeV z%=e0H;d8^GIAP%Yr4%#?BFm*1k$}0#{Dd9Y5&HYQs&^q1gqaJMINVX*|H zwKnY3CrIF->*CJablSabGo;0h@JiKW&Lvj1oZR06jF7l_Y`yT)RU`2DdS&rU<30xw z_Gjcs`w8`BZal@5zdOQ6T;|e6WP6H_VFw6=jl_BOiLiz!&~umY44%-0;yfU8o|46x zNk=CReprvgo9zcT5f%&BBUjT!=^p~GX4kE<7Fsn{s%x=4}(~K5aek1HUTof zt17dK1?Q4q?uYBq;qolI94DTm(E92%MsyJh>(W#=Tv9quApKAlkll4YLUhld zC6c7ck|1Addgh*!0}*&$kbbBOEEs;#3dmy}hY`}L1Qn2;tFoXLoE*l-;~^F5djUBA z1uW93cB%G|EEhb8R$*Cq3-ubIKMI>5Lx&SZ=qpK3qg-^e7F;H1`;dt`WO~@o>QT%ip#01N=8jb3fs zZJoYKcpDbiR?+n zH~l39zGh)G`Ny2PH~8T%MeQ9DU_9pTekvhHcR@!F;1&;x z$fy@^c5v*+<&Qhp%p6Ahem%GEkTjxRMbtw$-G<(6NJl#xwiK=6*Cx3kd)K%73H~oy-j!O^lVC9sfzA{Sk72FblKK zhzqs9MB-0RhZjPrb_H6LbIpc=l^^>0f#g?eRFa{w-F3dp$KcpL+11O?>W#!nY+mp~ zJ;s?H43<%u8QpZK*<(gpKPH7~KjTyteInT%kJ}#_DdL*^k!UhV?1LiZ5yJY%L%QI` z2^kR^8X7HHPAOr^WFx23QcgGPJI4HI`7wPhQ0$l(*{*zX3~=jB;v*C^ zf85a*H=^=D`4BKh9*Le5lDArHd*9*9exwUiMkLtm?8=O8px+WM_UuahZ=^bFv|MVK z_+yjAWE1^VqYPgRf82)*abN3cJ4QF(h%*~Gigsh$8VSZ5F=j|T_HezUqMZs=h#B1| zt&NREZPoNNS9a-WfwFpIM6}VLZl~WM9Fj;J=Zx5nMIl%cB>lk`ilKF*Y6d&Z#}C+jelKjo?*1E)Nz{+Ehd1}Xb+#has z_k+X?K&(Ny@!z44)iI;+QFr3lXQ1|1M2|_4no7P8*mCYgeCD6NWR1*g8JMZB`#yL^ zMMW`Ep=w4Yvv)-yE1!&!i|#M7Y_g@~$z%T#BVc%}=*YFn>}j`KP!Ds<;haB$Z9i6_ z)(nUOm=4jTu(@==NK(`!A)wSXp0KR&eQ?AKo<40x4(JWx%GwU zPjUe0#QeoExBKeWrkw z-l~V~BLa3x_rv?CqL0pAMod9UvrzwfTUY}zRN!Zq5J((GZ$|GqJrqgl&E=O7Vt70K zCu6L@xjrF2dC+tCc?fM0Z8oiJcrUXCk`yawP&q!rz#=z5DnV3ua5y57DD=~1+%^zM zrUozC-@qZz{ewAK34KivklNn+Kk=bmBZT2-h(JuVDiWbUqvbKdGJ9~1y$}%8NnnB$ z%2MyY(nm@X00QP{vZ9DB_(`aTLT(ONKz-oEF0L;L2t1qc_I?5464*1Mf=xN z4{t(HR405vy=5WE5UxHhOKrwA8{6b?pcb?~k zBrlKUkRYf$9v#~^;z+7a-5^Zo4c5SUqUnq0DOj`n#@hS(Eu0OucBQ>Mf@h62`U0<5 z5e<%l-uss%4DrL{12`E5tJplyepH5;MEqs6`>zD`{L+{Lp>4nTF2P`_z0x(4ACYA@ zy*V%r)rU7&7e2fI1_rcHxdCEIxE?v3zir1w(D(6XR=#nCiiMUSpSF#=&X{#nB1Iw2 zm=a#>Zz9OTxD2`SGiV`V?r^!D&`XGdk7vq^wb$jP2t0gNcD_%ebv*30-E)F0f-&35 z@%3##)j4N-zvsT^XCV~Az6mh@s>-?Rx1%nMHe55wi7wI|w4c*H)^$}P;!?sr3p?V> zh2$6Q3FA$-9FzQ;V=S_r-C-kx%^fd2TSL4mP}08LkAmZnd0koH!Y0QEDQ8clqb&3N ziAj{)LxRS604a7Q)-C$1Yvd}ia)z2PrGgTK1{K_BF{UnMv7||fsMfP!yM!(6`1)*b5I5`&e zPk>VoQBc9<$=h_aVt3u+4cjy>s#u0-BcygM{!j%Xvo|4tR5M?xH3Ou2yJl_1h$|SP z!^S&)SxPyE%h{SAf*i&)dz@t<#elSH2=oYOW>{#TNaH|CD|EjxTIGcM-N@vrn2G^* z9G3q6O*XHZa3}!oqLm%wHq#R5T*idCI`9U<9>)d}kd-*4#XPlw=oPxEMO?5~)EN!q zWu@RFWJ9`q!ne^2Yp{3%!}Elw4{5%h-+#iuemr(+!JHLHy8yaRoOc$P;*&v1dcUY`u5DmrRVoJrshYILK-Ez zYa^vt6tn>6SC|B1!R7L+oGHx7bP!ym1JH&*-m!jPWbq92ey?t4{SYEjm{lxK${B-w zHGJDK8R&Kjc9u92d!zMqHXXs2oug#16_a08j;ebiA4ckT2D9cXcmgY|_i=}yGuMI- zZ-i)E$rv-|f?XjT1BA;eVN1+~)xCK5z{;Ug+3MHK{wlav8O2Cayq%XqQ1@yP?YfBb zo3d=_Ny;e5C+9HH!Q|I0AVc*SNc%-}(E{Zlt-T)^uBC2Y`K|cSnrAHJI?52XGe64) zRc>O}1!RpggYC-M+Xz)22aDX639#Pl?69Q#!r^=FjGNlcy-eXy(<}VKgk=6z*TX~Tb998y$ zntDB9xIF*;M3b*S3?=U98qFzDTNGwr#WR?IeJ36kJ}8M{R9?$)h%o4w(ssATP=mt9 z4r;?%p{(|S=!!S~@T;&oXz-8(p4998f2BOni{0^VqvLLhcO}8e-$~qq$QfrV_DgS2 zf@8_$Sk?0P7XVHng89v*+>MLLu@@12HqX5o>~Zfh>Nx;{N4gZ~aeEyfhr|B3a|F*c;8QweLF{7^ zZn{McD|N^h2n8oSgXcTBVl_PF3DzbOw5DjVPg$G!{P-n+H?8EpKd`v2^TAz`+lx49 z8}4aa$8tsBzDJ>0SFn-@x^3k1 z&{ZE{qBb<1XEdxu(bo}Xi1&@NoBp*jDZ{g257KTYmY7dArnBD4w#YD!oBkW0f{NidDV+xGaNWe{6gK1 zne>pw?TqI}e-?T)soc&gC1AAHul=$GLDC932VwXRmV{$&nOtoKyoR_f7*IK- zW2$~QjJ5(6F4~AM4|@m9dspAiB?Y$M$GrQ_-G(la4IHk)C*&`Z4{JvSzq<(XJ2J6` z@eU21-O$M!795Af4~P+Y`DM+5Q<9iZp00BzK)ltYR_&9K*8 zS+f*OrKO+zA&^(qScff#l`C_c1r_vk#CEQ&N9S!cS zJy7%h{<_h!3cCj96+vsjbxnd^-$G@maylz?y#_&74FKUwdSl?3;?^BWB7$x=myiFh zfqqUY{;LoGuzM5>s-gk`{8Rt)7=?|Av4sJhg^huk2?MRYtyzS;tQag5)<5sSN{9<9 z0ssIR{!}H1pYx7@N~oK3KOKNhieiEQHB&gJKMfEw0T}@RfciM-4+GGjHl)3{h7$k) z+~7YIFog;Z`)5a~L_%0V*dwWHDuJ27g zcFft?_xM(=P!A~=Q%cwL&7vLf-89&vt1C1W@||Q^ouj^4gZAW0&OG!2$6N(Z4k;og zeo}CW1~N%=Ezab1ygC#`7_S)0-s&A>>6+;RWVjN0?nX6g?>jr>!n(%DY++euW{y>N z1#7!oX!+`^6@szZn^r8Z(ZU4?1v`EZ;WB%;Tq+S?3wuUB>hq_Bexh5-G%7gI&}^GZap>( zC6d^_gf;PaN4;RCP-#O5WtTz{rP?DWa2(y7=)Lt*#X#|)(+iMOe7}ZSovPYn!7|rp zJkAlYTtYFlPQxl?!2gk}Go(eKra4azS$ljl~z*N90%^<3Ap%a3Z) zc9MJ!OEP?2n9uiZx*pHh9TlT{yzhtdnbUk4m;i4t=22+NlFF5-<7ezVmkpn_0>#@$ zz_e9T;_0XT(l^})X{F>PmyXIj;?%5#pi7%l|3&QEshG!F4iv#6TgUvgAiO8xizw** zPbz75H$Kqq%jrge$*IlF%^arc%p52^kt2#c*NK9;_1~+IQ}j0>0=Qyw0%e(=T($NU zYdgbj`^!S7zn`~xJ(!mr`I2aSzgp?sOVhW_;%kw<3$GwCJ_;j{hNhwJ=+?tBaV0$)L zWfju{xwQb4mD~26q8`)+(o=_PmRd5VhE&RxS6S(~_;?v-_~4;nXz#&GCGc-^{|gVV ziX;gXxdxW5fp*20|4e96*zlgM=aqHQ9mkpz7^kuEC2Lz*RFuE)F6(>x=#Jg`SeEbFOR#^$L^2Y&UDXrFcGT?PN^l~$IFKqU2e-qYuvB%LmX+n zS-AXQ11~_#(%YHHCT5jpPEDZOJ9%u&dfWP%?QU?e!CgzKywnNLS0UiVbcURokFhfF z=MV2n?_RTfl$iyLBWyO?>>YF})CU>V%;$_v=oB_WC{x||;R5<0#gIkBbXRUYctkt4FJNe4Wi^9V zLlra|Iy(qwR$wdK9hR+B!5h6`F81&vVJdop*j9cxI>!ef)(Jv#mr|6$#~0?xsW>y) z(KvP#kkbPu;L2D8HoST`Gj;IglT?`+(qjSM!$9Zn>`rtJhb7?a{mrY+eiUlQZ(c-D zCtVzLB@Hzdp?s&0xlZ0&Nq;N3gar4iiZs@`qCO+e?f^MUUZ)OPkJ8iG%A3f|`B6;K z?pVP;M=Yuv9)uN~nnL?(b|R^_ASXIJ7L_Si1@022gst;-PUCP!);_VE%Sn)pcg&96 zk5p=grS}wQiGk~V@GxpHGv|~sIgk3PRC3Yhz5@S~6MPKh^b`!u>4Y4h^H%IW{w)?_w==0i5I{=c} zZ9Dh7iXy)Zf|fs=?d^80(XcTvt4b7Du-nYRR~J_vAB85?o_7Z4qd=hmW612>72+#w ztWZ+E7A`1J)`1C^Mjw0R_TW|d&8 z^pv~<=}2Cj9r>NV({@+$w`AS6;>L;fx%x6fjh;n;q3lRQG;tnH_JJxt$Is;i{?^)Z zXBv*>@%X;|HoAzz(`zwHgr+8tv3Y$bLtiUZ)ztKyoCP6gW#%<%At$CR5hTIM$jlzv znKkAdg;%{ZigKsUIfH0lnvjJGYL?E2AO<4MgKhaj!D+moUP~w%oGRw~7diDLD|3x- zKD#+Ddn;BU^Y|KHbFy9ty}vrYtP9IdhuUhd&vbs(IS)zty}n3RG(689tC5)xPuscD zHM*qrv>#5}uyNZpghuszt{+w|=Y1T`Q|0OSu<)>OO{%wQP6m;CzmJz%xoLTFy?xy* zOF6Oca+|Q|Y^bMe0dielWa;)L9iv6mER-skAxJ4JUt!7o_Ss_P>f%4a%MzTPOiEYG z(cRn%!_wN3-YYqh_wY9LsH=4I_B64CvOM4l`1!rSQ%8?8wF2+1M?zj6-wcwsjRW0J zm()XUreDw??`-P~z~UE&z@Kz@VV9bXvdt;b>#%2=f)f^sW=RBT8cESF>tv82#`OC0 zhm5=7;|OstHli^jg)Zp}ykSGNX{1D3Iojr~-qaT};5fs7)(_}^D-yU-UN~~uxGylT zSoE5dr|zXB`!V5;if!VPrA1g5f6`22!7}QO8kyV*JJgaKF_Zwe#IG~*1Oio)@El$4 zwMKh@zjN9iTlwdVMCMvPf&K&lZG24whfA>9>{2*ukgEBBq~8xctl#T?o9$~&K_fwn zIp+FozuZ=}xo%%vnIXn51`YS`lQ-3^xv(-a3H-g~`3Yv#kR3|;|KP?10_nG*#sq%M z3NZg}Ky^&xe^iG#@Rz{{?4_A^zbF5L>~cYhB#=}>i%fbBpVB{@Kbv?9R^+NScJ!O- zhPB(|*dZ2;XYnV>Xlv8p?%-@vI$6WdVw>Pa2XId;+?_GFm~VqXjR<^_%`8y`iL9H<{ctNb?s>-w2I98A|B*~F9o%3Vsq`Oc3iU*JC3sCu@ z;pax1vuj)KpX1q z8Gu<*WJp;Z>m_Mh6ad~~kLC*mDYd7@s2&Wud)AKh~}ohAoVD- zXl7j=`Lf44xg$w{o|{Rcl)mHxF45p zSSwrNI7%zu5`I0&^%Xda;fCTiJ%N#DYOvLeW)htoWuhA$<^0ZNuoV3TJ0w+0_Ux`D zt+-6>!aJC9&KbN6gv4{~GILbo(b2QI7yD!O0kz|Hi3fVQZ2q-k1oUtea z49kutd;PI&9_C7pQAl!9ys6t)7M@>cc3$c~#?=nVEQ{42{CEO_yPcMqa1-~J6G^M* z!)_bCpMhxl|Dx#{!{hqCZeu5nowS+Qw%xF?ZQDj;vlFMW)!4Re+jjC!fB)zGHlOA> z_nf`gUVH6z&$Vh<`jJ=}_jGqkV{4A%L zMh(3(RclQf1yZ|+vc(@XiXZd&F1^#XKI)d@9}Fre)`tokR|Lby`KHF_v42=f)8bv~ z3^K$qHX7x26j*Myz_%#P&eetj3~qbYgIF17$}!tc#KM>I^gi}8x=3F^MqmLOqUXB< zeWOuE<<8$9@7b5D!u<@{vFjb)T9nhmoplg}${t?+`4CWZcVruHv;l&@|G;JpBe_}U zS$yT;Z782I?_O9~xR8r7_B1TC`6|6fxoCj^RMec%u|3k!Jg^A&Hlf^N4UM!k(;V)V ztcW+^#bgO`T)}XMx58zaWfKjyd6EOg!-&SM@j5HESyWnleKXxev8DLJJDg9~w1Bfb z!(h}}heN9-rLwpLP2-2fF7c7GZ94`#%*}z~+S-DIC{3ATJ6KnX2M1lF?-{~Z^YWuwG z(6V^$H*5J$h;GQ^<8h-{_5S_XOeM3U*4h0uMJy3m1;Jw5`l;#ZA%QI_FK8*eTzo6j zK|0^;rzpWSknykh-_m$BII8+_^Gx@E*v5NMitj(re!4Yqwf~nnSRSd?W#bcI^w5g^ z@OY!z-A>v8`YpBJv81u>Ws=5zpaHx4Wm$pS_`SF43-b&NkhAIWtgP054v+a*H85z- zAhqS%#aqb}=uwx{3&BT~`{7qzQzL~BgADV606I20+v+2PR3|oI?JNl;XL#!lL40wQ z)**GP3;G);aLs|?GA0x$n_wzq)ToIJH{_!%=HjQ2Oh`8ft)^yQ8}$$s`-dhKoRAnkpW7~EDs^^g>gfNfnr>^&C4gf(hm@W6exKWYPmoL z?@E^sD(KQLt1z9V&g4yllS1-zBPXQk-+tpZEEwal&Fh-=35K_D*N4<*R{ZEfxg=n@ zp>)|t4kOOi-Fr2Jd)f--0*@wm_9({H;PCjjhsNt;nE#@|#Y|Fgz2rdIX>170;rZb7 zl&2ag&CsQyUb$Qw$+&@z9Dy}p;A0K%s+`as zj}=Pl0y|{J{y<@CnK$RoH#^1_yi6bq^zZ1Z|DJ8(q9;pXKB}C@@5@QYFL}1XsJDTh z`{V=|@ePkP_uKABiHdg0LT5|Yla=?7;c2jl0b>X1N&(B<${)4@R%Z70ix+G%)1;26 zlRHiuK5vTq4imYBMZ;|&0ZqmT9xe)M5AMMwA3*@;;g(x9B*!=za53@=oLsYbRkB=_RNhki<4u2 zYG{53W%&q#RwG*rR!rkoT7v6w0EG*e%^sup2<1}BWt#6-mNN>C9M$IXdfhJ}qGT*= zwtEYDJ>gH!DS}zMelzO==1_~>n!9D~$bIfqS$MyTTD2c=?B^-}#|?Q%Rg3p6Q*q^@ zG|;i09}WA|q-J~vKC({6Y-fpb93REr@f9xAYw)yp6kim`n)fC?z6~Z#M@T5 zV@}V`e5cr-&$bh3P+E4LD>^^kNz6CR*^#5@=(eep8~#?nh#AlPLPH{&Y}#aHZe;7fyD9uVaaqHl9?*$*oqv6pcfnZX`}rP`Or82m+18j`-)U z<*XkN%xGDPhCKUg2Ye;63yHD9riLM*O%Jvlms8qyBb)m{IH*C_5x;w*FdHA}Im3}quZ7>|ey<4?x z_mhvo^GJGe1j#`0W}2Wg5J&r$J+>bQ96XRc$V8n%Fr&$fyZkxB^bLQe&&|sTqVMIa z0>@exvoHD#f9TnJ0OMJugyh_$C!a`=FgBt^oUFQ(jIG6lNT5@4x?HXO;2aH^LWgk| zh8OLp%JIPR$PTXq`@o<&FTd&ByehKuNLmNyXz+XqSX8nM9>2=Ry?n(3iU3ak7nU07 zIy+INAmqS6|A!n`1#4oC_qV$Yr3hk{LHNjF*vK&SIGF~a9C*XZ3C&3L;CMao5TA`; zy8<)9J1*<$zN^^dUB@p1yfGER7Vh2yLNzVhc$c?+!%To!MYRk6JZOSAYTF<(%Lk;! zTti^3W^Uyuq`!z#s#B7(K^gtw;6FZN8vc*Zv{;Z$;IIL!HwKsh zpBmFVhiKi$>fBp$!Ry0e6u7e1n0&)w0;#5@GL)TrgiEjfF;+cyR5cd?boY%5tr-x~BqznPrR0ToH?u^;u z4kq7F%l6)ylNb_VF=xIZ%~P8|EW0=Th5~k2Gb@h;j!80M(i8#uNsEupSgeh6$PP0#X0t4E zq<&b+eLNCLR*YFB3+B+KGxwxnZMmkAl9MP9FkVwg?6w`^#UpY&-rr3`WMLw#Kfnz6 z%|O;hCR#QJ=O$dER*1?b3w@-2hm4jkX*KJ2zgHBq-wn1e#V#D=LN3E5C)6}P7t1YL zCa(VXMSe30Ha%NAJ3A8Y`oPSmph}+(%w5<{+UkvyQG}#S@qQ`Lb!$<%NBiNQz zwmWpo;LH5FX+O1-L)&q-pWpRb^1$I@RWUdie3tkA&HLuZL!#3rZ{pHS_6EUUb0CB6 z`K0R4WhXI5&1U-mvkY?^ilKJ^fF<78HH$p!EL#%8O~D<^&6GT2)q+q%4r`V$+J<&x zC9?ZEdALL)&D;Y_HhxLMECt)_5FB`3hT=)eE%Es^P53)U>3J)h+W%w@{L+W@rWeX6*sWgG2%;U3kaxt^bfei{Wl%1=5!7=+r z<36{}F~(_N?E|OEUru5A_pk9+VLLgiEjyAtIE=I4d#IpX4aZYeM2j@4(XBdUY%xE@ z<`F*Kt}-)#7WET|)#xZb9&=jeD6c8eGbTlyuuHJ0Mn#z$CICWfzTao`wF>U@d|_H? zKwRS2$;nHHyM@&A-fhPVmBTnqny1rj{^Jwk7}c9>5C~2cUj@WE{ zi2I)4Pf)0sO=)IKFQ7zwi|y#yssI2TW4n+eFHMXAI0;kVkCY+)#9)2-eGfTM??%6{#kq68EN!hSHgeG~d zWfh0s6#N&hkxpW<@g4a*Ys_!TA|bg?c=U_CV{q4mxOT8|x;0!%%$qrCOIV7*#rmzu=`^#U|qtSxtwnqVVg zhx_sAp%aY7@2bkV4~*6ac%L{bWMhd}Ph?fF?K5^l`KW^3YeSp0^bMHyS3w3HB;!WU zPz6VMs$C~?DX&}^n;|@{e7W<-?<&hIFqRU#d{{uLan^gHFH#k^nFcU#BMXf7)5W@gars_?gevgo4;3) ztGo4)vLSL2M*G8$4al`n6B>f%R{@liqBMr7_zLB z7shEzY0A$NWai}4gNm(fCjtMF4+s&7VMr1EX4EU23ju|{^2QWIFm1YGoX}@|98a}> zrmf#*?Ye78Qq=am@~YNCrMwT45Q5^-<^9$eomBYIeZ z^Kh{y*8o*br{dtN29Hzu-9COel;hCjV!u&l<^b8^7I8JOqwxs z$?&H9I89<%YAdPCr|9})|BR8cZk_5tO3O^>{S6Y4D7`Ok7I-XZjwvzz3=Urt5}Oxc zah4;j7!7&nI7$tqN2QedF0eE$PHL+_70BM`-#GzLgkm;_r|QykZgkY=rs{(b*ii*;(&QUK~-Vm7B0fI0mdx8Ct3r=*MxFh z(a{HVD{^n8BxB8e!5^&1ZiQQqNYB($yk+Wq*Yo?_GnK#Pyx04VKXJG2y*A(e z4N~PGmB|SG$b=U{41=%TgKf(JDSB)GzBPVrqQGiA=T`|7Zzw=?+uaTSm16j08y7q_ zh7cEsYkv7PokUO9DustH6(2gA<1hPP`3HG42kT9VGoC_`dHa~v z!0SDykAQg>a5i{oXF@%%Y$9(R>Fs;HP+`?baXgTYf-lgy5z(z=I(*7uEAakulljwi zHG9=IleEL~M6tEDP|#Q3+|pj(*^|KK(qmFWPn(z!CoQi;pkw7Fb@DQ-sm6;bSpgJx12%zm*G!Q4EN5jD1$8IJKNg8yciFSYd79CfwoO z_}MxGKbIrb!NbRflwAi+8H=GDAFnd#6$!*np zXMdH0t%eD(?10pO=>(i}Jt~i-FG-dv+PaQ8YY8~qJ?@ubBUw>5YZq-5Bi^ww$$mq` zQgkdzCyOtpYcc1lLJH+lq@p~gGgc#%+h~cRNIU{J2vNT=hGbyYw5g$tmjjFT*9*=v ze9#n0l_^qm?`bej=+~a+k>O5PD4q`z-}9^=IMtiSyI@CNZks|;jnVGMi0plC>e+`b zgM^`DRqkL7O7+r$SY8a-l2-N=w#??F)n`FKD?ge#*tFfjSw2`Y7P- z-KlmE4`e+*ARfN`98aCMtamNKnzlec6Us?rV4J?olEL0Kb_D$vTA0oz22HeStKE|8 zXdVbndpdtW%E<6GqK?{%)@gN!a%EKJk9rL&&R1&6V>K}EQ$P8@O&XWqnsFaOPRl@* zi)%mFn+E0Glw_1RH%AcR!_Wo$&|kgYXx!?Pbi(=SL9_7aW}~x$`&)_C;UAA=vA~mU z`IaHlS0m<+Y}?7ESYP=|g_dP8-erU@!@a8^?)veCvwmT+7h?+Jp~t*vbeYNlK_5oGCe0`4?=4|VV??0-+%U2xuQ z7b}0C_*s7Pp4mc7%0Dgt@o@h}a%GnwxaMNdhS(`aM4kZO6E0ZuFe^rkK%+B-xbH7Y z51-O)$gUjxF~!a$qmMf-mWL1J^o4qN(oD$eS_(e@l(QvOoh*B4h@xY%(=G=-BP^xv zS_-+e!$F--mFq2t&zJNQ0}PbtNFCnz0$YzJ`N4={Ps0Ixu%IO8FaI-m4_kz~6a-p( zAw2%HGwL=g2o;J!J%xqVBf{Ql+lTB;ha0BiWf&@G{WT3r^aaW;9~z6BhINDthEe3&{en_evsi1d>) zWfPh#cmB+jw-IhcqBcFpo}?3(;mkcTePeE6*VVb@FT#z`Xly!p*M*?LPw2lXv_jD$ zmQ*tJg2GcWe!N#Z~FhENntL{>W9kai@B5UjX8eel~o=)7X03#CKauFWHddQ92 z78mW7n`8j<@y$i4GPIA>$h@)z3O23C!Y1MIpx? z*OCRQLYPHE^brO1=(}V-{AxWvcB4_VjlLYK8>e)C>>+5UxE1H^eNnbq|3z)Q*J+X3 ze<{93(|@`#^J0_ZcC*m_j_9fzFcFgwWRCDFfgIT`%fFUI6a0d^|yL=-k&6EG2rWJ5T+n( z^1kfd+LbPMt-){4GIV%2UxMLt$nV3?gxd>F{A6Ne8SRsw)X~8?b)s=66e(t4(Drh? zZP+|)_TF8-eU--&hf(()E~v7tl#%TjK(~LYDS5^u=tzh}D`8DmS0C#$H9ZJWdUx50t&C^h479y=Thl^=Tm6>x}nV%sV4f!@U7A|TK{UL&) zMcM57JASVJo-@{m5)D}?0gfX)tZ_w3&8w@UjJ+g$CPQQUnPxhsuj)# z*N7wV$QYHuJ+7IaCe?lgt)YK|jm9S!7-ni%ZZTLjs{`5K#JIn&e@|qPqgx^^0|1VO zyK52#fo?oP>wi|eck$I_db_@~RCyU&RQpx7x_OwQUJQhSKYW|A(i_-awXxY0^77K5 z0rglQa2R^NIRi1MF|V~)*_4=dZeh;v1V`f?N%^iE4Ud(IrEVpmz^nHqbA!VwY$89G zW8g@#N|-r{E#LFW_0L5DU@hZwYo~V9USs0^$!$t^ct?kf360Kj>uX!1Q9y6*v}QJk zuX7EUSmJ}Ln}FTX%ll@B)V|d5O;#VC16j_nAK({XGoaF*T(91h?=s`_U9ZD?hA~I! z2Q)UPx9m`9JnF&0%8JCefrOic#JBeS(epJgCSKNPLX8|auBgwqQL;$gbXx28&kuVK z`vl1K>hXhh*WD>_nvAM}5tY{YJ;ud@ZNf}VaRaePNa(~-l9^^{^RXLv`nXd4;~tRD zdiun(h5W^nBFU0Px==3JHFYY#z=G8PO15h!*^w-DPdN%D z;_8=}U#2T9MU>j~fP}KBxCMJ*C+1Ej5wvl+02Wr?a4XBptdkQF7dOOd?A+D`fdmM` zmmA)i7u&cdULXN1mtGd(yf?@rRcW?9c^J^Yv$sy@ z=tg;|7xjV2&VTD&$EQ1*<{v)a7h{i-FsHUQ>G_`~JH6pNF_)=7w(YS0MyR+;;OwAf z^{bP_U9s|-n&7etB(9Cf8c;z51-apSy@pDNlNW`MAK)5lxP$cDR!-hfqBO0p+9d>c zG_Bf!lxyu};m0vYrNgew)OGayc`pX9m#KUUUNuSsm_%P6-UGRQH2h{Nl6E_Ld+Tu5 zM~l_5vnOy%MEMM%Xt|28J3eU{?nJyLTGu>NKCsi7xuXIrlp=9xJ8!2(JNIG}f>pNg z?B7Sywg;;(sp*>ih{{EPPITmPWF;dtxtl*C~w(2ATGEV961 zA!&o)mnht?KO|lxxDLx``0C)%bjq>}4)#XvIV0+Nmpf>(g*utqf2f*iUrNn2j($@} z(`ufhg;>@vWA`;ILovtG1+FYUiz3V#N?02FqTb2KIj)d{y>uiUY%~e8v$a!U3(%3> zW+aBL%%+`3yXnFb+DT6zyv2wqIQ{|tD-!oYL%Z*(w}h%8*G83fWuu<8Rn#<6!py=H zlOZKUx0I9rS0c3qLWX}_HQM-P6ibwkhr3B3sGhEJ_M&xpwuWyyHQkP)C)23N zO7ch^PS*BxoZ4=r^SDyvrJ6*V;vWR$cH4%hgd_0S9;g#V^`!3H-!98qAi~qTo^PkG znPzGj%Q_~;u(Vlc!9WW_foJ8nqxj=F(@#gMR&N>h(B@fV8E)B*n>;_uC!SLyxl6=qz6jYZ~fVSQF^%QDv24#Zigdt8kK*II!I~PNP_I)Ydhy6QPI5poEJN z(>J%k*Xf_dVmWUUBn>%mau4G}V~)6qb8168qTFDwZ8C|GDN;~Ze?e6VeYUfAOE0lu zsw%kxKdPCF%Tb7woR|K^-e-#lbPbqO0VGL(sq)~~D6q^ieA<>-^B=Wi3#CEqNT{ba zlN{5>tQ6~JS$2lDQRxUYBd5WK#0y)rEd48#>`~0Rl}>Hx`s4dSk@V^s8&pcoK)#~R z^+*qVFX80uf{ikAsvx$-J~*;Gtfo-{6l93{(0r= z$9jGW6PFcjG($p+Rk;vyB7<7-`ZlW`VWDHbDDz}73+IkWfqypDrK6ZsJ&RdgGhOam z>9KvoNaC2AcYQ}tOUPGW4P-*9+QaT=Yt>iXp`d%D?{BpP+-PrD@g6kHC_N?l)nFcI zj--EBa?${0VR9AvD8eyOdx|F+DBFY8Y1MCvdkwi%!0!^Z5Slvt>W{y>R-0@!%JG|G zu10Hhe0*XcWAgj%U68$CT>kxY+kE_PNj_y_^nM%gJb{$n>ybrkneCq`?8*lKs zo8(d8tWY7I>^Q;mo}d4$b^6K|>sT-=yB@TyTx>)DzuBi+(`-iBB4FUsmUM+xi^#53 z9LHr8^JJ=!8z1CdBA&7oCO+$1Gf%il8+QI6xJ2d#sm?rqkG-o_xnU;V2OT+(CHLZV z{G{qIelQQ+o3r!PCli1w&3YqAe<01(RXFhQ(I@^Vmei!OOt?QoxvFLfgZ5f;l4KPR zAsz6&#x#>oHxcNZ^FkVF7tya8%^st?CR@(;*QLch74TW~ho&7UpCpoybX;RVtKmp! z4b^pTlq`H$*Q&Sa?Q+~*HV^<*(-Fz`_0DzkIQp0+ukAs6YY{EtvoN!2 z{VuWL#rBb(JDZ~eps7HM9{Ktsih1GvS2-=}xwREq6U5lQ(9f~7FdVU9iC%){K){^2 z7q@2gcfUzAwd#<}uG@gdF>;U9GNJ-|u?l_jGx3_`x#ek!4L^ufCLA2%%S*Dbl357R z3T(Qm1S~HVyp38xy8X&EYZ1EKK}4`iP7MqB0#z6Cm~pn575W+c$uvM`;(w76!=;#f zJMVF7qs^Fmf+zfB!sVRLbzHR?VjscjO!}nI9CS1X-$C((3vC+r>)udB1s$*`${vj| zRB993?Cd_1FrF{FH&gs=gv~ zfNj0F=56Iv6l)}I5L>!P(xxqCL)w_zzvy2jt4cvgXMSF};JVrIeUVO}oni?KaZ1yx z?+&+G%qFcXs1(AG)bp6yoL@mYq= z{QA;;hNT`@8R0C%dH5xz#n&7tg&eJ&TVaXfh^BF*Q;611ta~4#WDj0Vu96lc#yOsf zcZxC>d!Q3jZhH~p$g`@|O8Pvp3azJrq!69q(dp1)<9DS}`uFwf1}OlXr^B*kt|^25 zGKzh}&V3$CDll($i7SQj!jZN{nLeFXMXv$LOHnJ_(eUbdUF8KFneF2kLivxjO{ZTn zJIC8_a;n>^S_`oNqzeVq0YdDc!0XGej275S?AiG@XMZ{4DuJfWok`n<81!@G#GfW& zyRoETBe_DGy=L+@hl=-eQcwJNzkgO8N#B9YxQ`wYNWz zC03+56RC@zp{JEtF|iGVh+Gq;_PrHKRVHPHyd7_cEFi;(DjbwNwd6MnpgqAI><&T@ z_y#)XqNdEUzH$7d5to|-%#m~$y?6aP36h)l<8#8YQ6Yb!iFmVM5ecb`DF8(Gn^*kX z)FvXVK!S+G#n~AtOFv}KF=-~lJVE$B;d01Ev`97dQ4>MRWc?NHs~qY#c&nH(W}H@5 zyf@_3$DPj4$Cie#zCtlvjxe!Rj|)5{R#p^PYkXNsvZ8J~4soy+^P%ZGOw}^(xs6X< zoS3CStWok6A?PXhy_axh+PjNKD5|J2H>MJ{gRau+2=htx-WPe}eovw6W8wu>?Q7Mw zOuc1MQ3Nh~sn|qCqJLY}F1;V@fAuK4-beAb*dK2Msi9m5oDvp2xWqy`|Dj2>4M@3hC?l*&EY#~+^;ZNrGjz^$nuK(zWt~WPjJdRqrMI zw$k3X+WM0fQgdoE*=h#ELq3u_bTp+seVS%#iC*KuN2r957}R94(9?yZM4ow!8|4** zUdPMlVuC0Jw6w*#!fc(M61=317bL{V)FH~!OuceNgKKuqY-Id3aHY5Im8)<%IOs5T z{GC5JL}R;&bnV*W=4>k`YWy5ueF*xGk`Y4x&-{7^!4U(7_#C1SjJD-?%nr{W>B?d@ zd=f>myk&JI71q-6({+5hME(0>fSaL1sDEv3kLg%m5e0TpNFkQEnQDqTIV#HqT!0FZ z9upHQ8xJ=N6Dw$*QcoBOAt)9*&cny50xL=`acC-Ds4%+}{vCr7Zl*PSYUZt0Vo1lN zA|NAf6ea~V8jX*iMg#ZPE8$|qGa_oX&Us8l zDFW`ui2ju;9yKaw)J)9z;+udgS6;9V9bxi%RRiW~)pz97#XW~GC~an!Xgay{d)gND zf$eKJ<+240L@_c}tf!|^99|-zt@7#Cho3$Fo*GRL!w{2%DnvkqU5AIf>(tSIfs9Pp ztUzyP&xsj4J8a9YUsMB@M~&$V4jVw?p8+=}LtUd)%TetU6kA9fhQdRXdg z5+r`K*}D4e%kc|qy48PMn`@*OY{}TmHrp(&=9|5YJnL=e(U36RNWuy5CUw6#svezk zGV|zE{t18kN!hmu#o}u|HwzvEtUS}P()^;g`>iI-tWw(K&wRZ+1D^uV4xzdY$8^L% zEky2Cf9!|cANz#<^;m}bm-lYWn2bs6_TST4pD(E9ha*8Bm}!!i(z|NWAVCW}rcP8J zVP3b#7qfZ5cIsqGohYU+#4WAFI;QVPzSsUNpSspng~i~$6x z@U-y?ZQ~1zoE~l37g(F@i+Nhk4p7D6nW?6hbS9X4!Zs)#(@Gj@ilt^rB zpI6g$0&fqK=RvpD(U+T_-o3WW_mgPEY|)vW9KP2x?;uy4Zu!Tdgj$sV(bM@M(y+6& zsrSJ^e`Moj+ZmAt25uW&5YAL%IPTaRVnp7J9K+9Y&H1{}`X6`e*AX^8F5WTCa@~)) zKvI%|+~z!dStcGIUg^7e#tGUzFo~E1<36!FScB-A;ES}}nPY+y{sDkdn0A4p8Jwvb z4witgbvb@NU@}&zFW`VEi34a!q~T1)UdUukVy8nIKU@)y+oD*=PBG#YaCbnRJi|U* zgR?N?-EIGw#G;W^C^c^YqZgXVF>&v;k@dH|Q zJbvWrmHP&t+A)S#qbrc$I6O6nfiHL#j&>+MOfIZ+{^a5jTN~S94;OW3h=pV*esy&< zsu*lL$?<5&u!a*mWkL4k%I1VfM*<|kI2pHwYB>G2JW6mlDfQUiWb6H`JZZMnD0a%H zOASQF;l`Kix!4|7+uUYa0P&V&16ZY%(YBf z`MpQIz_Si5IxmLz=wjy34|vBqEkfO@Jqj|#O5%-{YzZ(?0{r($_J`?AQ9)bbjG-bIfz;&Ie6Rt z_JvU!J8F4>r2vrtP|2@06c1J!$pxThf(gZ}t*_q?NW&H-iAV%G8B=yjRJTQ{$iK_F z1*3zPrvV0&?)}t!@S8MC-_SpzF&WP0_P=>kRBvoa`Z-4yuMs6BWtTJ}GlRX(yUr%J z$4;)Rgpjz=>t+2O%;xGl@m;Kg>+hVBX0EdJqF8^yG-9* z^O?DS)5x2>I7u_o_TgGt<&Y_0Bx0BM_5OfXuBqv^ID133<) z=Tl-Fc-7jfMR5r-b#=*Q#_8SeWhZtxXA$mlsn*~{xY?P4$e2>>@1}8SvwQKBK8AfbR!EtBk;*soJ9lUk+^H>6zp4F=j6+$<;$I4sWcO($ez(Ou_@F5k+~ zR#zW&Bm~C>&krcLIKTWaNziap-_~F$t5Mc4mPWfDA(Q;A3PxLL1H1)lKsW7VzO!l* zY4*T1WiFO^!JLcmtY1>M!Buy*2DN9y>dzB!6>vE(trnNXf+o*UT#iOYy@|^roCP2V z_#ef4FL6iBlQ?h}#R%t4;WZ9o`F|{@0LS6e zRW4lv|8`$4dbEA1n~bLTYAqByY$I)r>Ei3=UDqUP=9#c9Sui!TGJ$^coS=f2+G<C&8@pKUt?}$|)5al-oPyeAyLId4 z(){Y?=G2nL>h+PCa4PR~H+D*D#M{AN$_|F|{EX^{%3^`@YgQ5v$(_$Nl{)*=522z;T{MyCCM8o(9F9vAvu{7EvdyoTUnO z@KBjFg7g?;YW-xg$9@DJzmHcoylAreKD;c}Hg~x8g&^`e(c1LsGgHUUNvfZ}g-r_{ z@xip_#nnhV6RB-`K2-?GFn%oVcl9BJ`f+gu)w?+y(Prt>68<>I6e%}2lo zj>xq*KTS5w;`2ym8|$}s$H!~Wqp#U)r{X!c!T`Vgln@NfI`{q98XhUVOOI6390)&B zxgn6AnVNd3MxWG4j>r1xSzl@ZxDh+UTRYtt;}uY$ymmc`}G`Nh?F8B9t&XE`}K z1=Z@LL;19E*X&;G^V6dNxhUw~DKAA%-s`EWxtpFIa535hgadN3{L>Y)%&Aiy#=kD# zLkD+8gHr@ApQP;EHirnn*tqIOwq>JtgaU@4s8ebpdTyCS1Eh?;aIt1ZQN&%jGrKiQ z8UKJbO{L2n;SJ#6WUhK7SA~7M$mQ}QWod8XWnqg1%zBzp;`R#iG z?x7_*qW_f#ND!?B+0i(i?g_)%!T|D=)u4ken`i!`R3;)p!VM8f(A?fG3tI-#K|^C8 z4~GiE{#;-^H;F`&*;yW7AQR{-k z`GxNZuaXnjUAArgt=Z%0sCe$=flTB={j07EIlBIEN~ITCt{{J1rP?T+X&j(ha|;~i zX||?!UiQdh_Q@2?{`WKa4!*||SNqDWC(Lttzdk>b!0C$(+9tIhwRs=30!I#5mAfqsnZlzY% zS#)Y|9%l@{dDAA->gvXA?Q=LErd?VOeTDwV$8++;!h|^&evB8DI|d<7;*wtvF6#_S z{oL})$!SqLca^ideOLC43>v5Y>>LSnG@u@7GHQ%Yl;&4_ye|oGg_&`khj}`dJl8&7 z4BiGyqVJaTR^|aMQOtm)Mg~i|E8pR_AysT8>lp2B8n@SPUhXU4%Hek>3s7IxV`?;% zFUITv9jm2()fFR${r{yO4m+MnNFdHAW-outZy}~FDE1!Rv!Vao$dO4>_;$Tba;UVbR-9p*?J!@F980?8Ake#Su>7k z5>L(@yWa)^<^+-4EYDP;c;qDn9|g?VI=R4&RhH&kI$FbD_nX2Z?NL zOsoY_4x<1np4Z-`kM5f>KYQaR-L@YfoepWX-uhkrMX#nfp ziZ^1&kKN&EnmKxmnpVHG?~QJEd77bEgzT+7Dn~>V$a3^9u@zDDGp{e9MTJ=%f(0SwNVVuIvYC&}Y z_C2T*%tQG#K(Y?1z8q9lk1>~UWy<_>;xQD6at_WL1jBs-Uo&ytmXS&~W35YG^#Mn% z_%Y~jDr?~f?0L&bTU(OQcwAq9s3r8`PE>%eF^$iIx9NTqk8hm(1?oSg0U#(_kAba93n||^+1%e#PrJy)K?lySAlkUbRJ-k6NVh`M2SNxWtncAJX*+FMp`pZ8? z+sIYhqOrEWw#qc)I=Xc@^LhS_xUwNWQqy@vivI3wU|f61c9v${blh}hHPjGfRm%RV zL?;^PyQr;qo2A#H7STeOqPR9c$HJh2({Z;9Riu!KtiG_H=0D24vSJ%|#cNApybqIFlyr9G5eh4lwDd)7iZpy%1zShmC!XPzmR z>cq{%T0Cw;(i34gZqvZh3Lmx=2|4fKqZb=BwR=C-#u$);6%-r|$>)g0wpRl`{FKv6 z;HU-9B+q@OTIncAa^RME3c4G`J?Ejyx-%aNmC3Ha=HfhDpk zej!BuWe(TQ_RFZ%qZYl7%k3=!hkDaKMP??4-CF$!Wp-xk{qwWc;iOMqK7*3`A7|Po z?4n!SR}X~aEl&%1uGM+{;R;iUDkVF! z40ebOZHkmCjYN%pch4$C36Yv4-Vggos6>QF&ojqE6nfgnzVnQAqU%HALYVv>Wae?e zy&j;)U$K$N-yf zOT1C+*u;3_-~R(zm>Ak*sryxsND31J8E9rL=Ncp%S^1FG-KA*6P%c}UUJ*WZXgksS9DDRNd2 zV;V7|Z3lN`7pu-e7K!O2TVCj!&nM7@0lu5J&~eb=>*_e9H@UD$F@v2?cT&?vQYQ*fKcJL}8o zyFn|scEH!h!SJUEd?PHjr7e#SAR9WiJco#m8vD9Wjj)vF)GCz=EBPhj<4Z=d5e-_* ziq5zA>NJkLpD-s&(Zq$Lz5*FxT6Fl`U8+bUrj*J7E%3-w^m+Q)@#K6V8b2ylat1F~d2r$9~0L`U26)+tX=tZqy- zgpn@Lvl^k~tz&w2Zp$EMdH5$F~uJatpD5~9kqRilsFo}pv}tInF3AID$=fKn~BW)FoT7Uqcp z2(nSi5}tl@j>diy`FZ|XeK&T5Q)kF#$TRv3`p44B31UML?;P#~Dc&$Sq#2S##9Tgc zesNFiuR)Z#4yoTV*N8u1&)xh)Ni#ws-`)SwaLq;fCOoNR*A6}dMTuUTB55l2K}2z) z2#aIim!q3!iSQmQlXd=u+50Nc*XK`{&CQ&Y80+?>?R@WKSJ5oTaOsf$Hd2;P)5L}n zyN-F$Io8v7Jm0LRS2(e-hRgNgot=1X1a&&rDU1|d+ee;{`%IWW$NIfw6xct_YWaPf zie<_mB14L7&%M+E@@83{?kUCryGF&z{3ys$ygNYk9qqQar%0`HCDDD*Cz$}v=b{E) z`i2g$V!wOqLIxGk6OTF!Fe3ig;C%<9xxzscDesDZc8{<(jgRP6FfBO+IL(Pt^Ds~1 zYVB13A*>4|c4*^OlhwhIvdpbwnz-2~)wT0oALOr^3E~BZ4z4%}LIf#)cl%TGNA}vf zhB~XtGbdgW_20S&=59C?EoRfIctK0R404`}CXBh&Uvt`k6l z>atPH+ZITq?68sp1f%q85tL9IN&V^!YgN5H#xBH7iFBNc-|(L~o<**8pWPiN&hGqJ zjGg$rms`C2@ZO#n=OGU*@riM*Gq7)JT}O+(wth%&#Q*Ud7tv`yy{hu_x(a(jr^WS} z?Br69?|EmGMi@0RmsOTUjSa1|x8UREx^D@MOyNhrRJSX}Gm2m5(#A@@n|eo^`>DXk zRsU_#BquqIj@8FqBn?O9rWPC5$G+R4j4Irbymi^r;H2IAMHMz1RzGRD-@ET_9t?^M z*8ToKfD;N2IeDnL%t?h>&@M}HLI1GD3b!oOczOR0!fNPG;pG)dJf8O8OtOU3WvfIM zrQr(1l!0#8UpN;hv{;M$^~|iH2KGls{ctrhqPdByo`c+nl9@_J4*?d(cvgXeBD2e} ztFIzIK7%Bp^Lj;cu7SrTau_ux_9F+4C{c*HR|z0NT)TCBj-PdtFTnTd$z=1+kdn|+ zVj7!Dns3%A>-VJQSVTcvC9q&mHP^`)i`8*o^>%TS*Xq32=lT9U)Ga&iN*cf?3jx@D z2l#Z$NEYs)OwuDUD9pX0hqd>|r%_dBxWIktFg?JCZ94VJ(D`k~8-_Au$ore$n(lPS ztR+TyCZM{Jpbhnb|B4dGcA)6lFlN;a3+joz;JYoz3m^Z(0fmjwimqTs4yT&8Z=Ih3 z!IdQn`4_qYnSR=AXsTQ(UQuorK@7e`o$K_+;QBBQBSS+x)GwcsVg^D8I(J2fT2To2 zRYlx5BCS6G%-tk^-TcUj=uO_2N&kQ70NydmCG>O-YYMD7fG6D~c_saOlj1hinK_V^L@O zgvnJ#gKC20HtSeg65^8X@`WLqzGFj@S=tD9{r>I?@#r-N9gnp&8i;G4RrMP&H4nP8 ze@GSzH$8^;TUA)YG!m4F@%Cr{KjdAy13wn6*++VaK%65g|KeOBWH#-Q6et-I{FolypSv_wB%Dv&;wF{lia;BlSiF%LD9}# zzOA#nxe{6h>Ws%Au|$#Y=`jEdH-@G$OoD~LKe>L3Yh-q-a}IL?HIrPE23Dp*wSxv1 zjf{ibyOUnOOXMK3ykh%~$Z0Qn`z+koWU*or2RE}+8C6Kpx9tF^L*~IxWHe1#mM)e# z$E#psIsS-`>h9)c1s@ldE8XVQ2_H_;Fi{SjATl-tJvbIPKg`(2KXaeNCm^Mr26fcZ znZ7DtWo3rI!aJmejRR%96n!H-#pvefw~jN>XtTqfg;^NghE~PKK9^aw4)m{se2JAV zwza+7p2!DXsWvRQJlOvG7iN+A=ocrg{jN9Ms`#_(ElG{8BTuUZ&XSZiAw2RA6-wV^ zFB|%MduLYi(BWetY!DETfcG3xK~BvsE^@NTRbO>~yQ$QVcv9&Rx43`+#gR;7CwF%a z^(s-8VhiA>cg#(#-xw(ojggUvMJa?NWr>Ad8eA|F52Qn{)_=eJ06sl-FgVR8`~e8Y z$URrsROijVDj2{Ckbk44_dyvc+#n*vT4oZWCuFj#-(-^Sy?xzBwN}l#VA+Q zmyW5{GEl1W%ub)D<1n{BHum}gX&B`XZprZ2h(%1C0v$}>5Hqy5YF%A^Pek}L6Ady<)$}|0HXv@85`-oy@W_R=MpSS&VV(y1$BJBcqp7po{-n>eZJe3*vyR zpHR4>y_NlX53f}>4T}@#_C1KIh1B01a6Fs_-3hj9iXZdm>U)`^Xaze9+xoiPTS>@S z3=G}Lm+F{oEn)mP5iS(mQ-fMbw3wyv@5SU|PH8^qgN@Kxt0&a9^PfaN3uC-}t8OHj z;zmB$jTGgPL9U{u=cKF1@4-(N{iUml5KD(S0rCE~fCak14p#1vW21dCBZH{GtG_+l zrToX3{g|p#{nmsMB+jJ(!Rc`fT7@y346IqVtHm&#DNG2nZxiF@iu2o$L&p#D+h)oZ z4@)Ew-D4)rZWRcLtKfoN$2Z}vs6dbDZmWsu((o`IEfLM!>G<|1AABEQ54qoHB`#f^ z1L)E}J@93L}!N`q^e$uT+usJBIr6 z`SsdZ!gy!>hdrH!-mGg1XVWhsy~eghZwr57?$djoMfvBR(j&=r0e zwIp#*9>00geW=nlr%&N{tADrPpIn~%zZAvLE$o?=ScdsUR&sInLkZyTucCqMnB3H) z>D>7~r|~LO^<$(!K|$H?PcT^`pdtD>5)l%KMA6()?)VWb~^RMH1ZFX~hd5n53Lg-ifg>}{@QyyCWM)Ql@?7Y{M*KDWvF`uVZOc(n=#}QQU z@gR30*w}zZCE#Ofs{*zxN~+Wv-rkvDA`p7D=&2JOA7Bc?A!!-&aA_@Rd<7y_y-W_puB07U#zQJ7$pG zDvZa-unr9GSMOvXbg@YOU+r3wZH~cjxFAz!B{2UK|3Ypqdg&m(WpG>YYK-?orwMW& z%7pFNdvT<&?9X)Q=B))Ty#+ZIqtu|@pJIpP1`;4A0(pnEKU~fD5OGhDAYt|yonGRa z_s-jtQ}6sr&LFt}zt3VopgFM<**hJCY`;UFtST9A4Q>qAi>}WKC&G9JgWA993-kab zuY7M(oe}B%S=PM53w8EaNWarcF{8Y9n4ahhcw%mi`@N@54X<7bSmAlhPXA%_5>y5r zmV+=I-v7esfYfJw5~m68L{TCKWB!buzTS4sT`NEIPPS>hx>QGm@a|A23;OV&%o`mq zp?C@&(ji4DS=OD(ac$=Hr&g*h97L|r@qBPpINSE|X~g{NkqXros9B{N;A}d_Fzk_< z6O%b^RH(|x#$KRP+U+y*3(MBsG?5|f=EH-@*)fDcgDBFJLqC??MPWop5;hgr3~OZf z%x49)1{DS8WY}`OyOSZB{07%r6+?;@p^(x@)mwQjL#d@mC6>wLPl$nF%wY}xxvsd} zz31#Ff5E=t8*)eO%(-)XOpfW07l9fh)3k`*X(m2SfsEK@)prJ_t~5fA4{F|Iw_c39 zXV0&{{m%vxoh*3v`n#*RVRIMv$-Db(FLZK`^C zM0pgDiO}A7VIp`V_vg|#YLgxfSnA|EvSisrtrWWmX2M2z%icnE z_36el9%M8#)@<}~3)XDlI@_|auLM*_7dIgchakS+C$RC%B0yH7C=#1qbn2ynXXc^O zTr#{?F~kfwAL)XA3dF!Nx`~^Zm4~odMFYm>`2|VZ=6K!;|F1=}j|Eg$S3iUpvl;2d zr2VVP@=n?ZTDbTzQlh_pWP{;F0e}jyc%r}jxK#azD!_MU(wah}c7#71T){&0Spc_s zgip@jgs%j{nVbrI;famS*Mn!zFMGG8Fy?vFWLg!uW<$LVN{w0uFSNvDC zQEzUQ$MNWd(-Nth(s=?d?zn&L>jiMJm;>GQ=e{Wa!c$}_YBA8j&)deMqS<#Dmp0AEs(K!e=(Jie0wtTB5r_}ENgXv^)c68db5k~->`;7 zcd4!QeQp8!@8vWGgibzYPWNQ|YORiE+px)uD0#theY82r%4?aYVXI;>RJ zS)y*74Ot(OoBXJzZs`KMdV)6bg(WjYb!j5CP=-_d4|(rLo0*Z9nSCxH8I5Fsa|)%uPnvlkL1HyjS}8+u%kobDb+0w#Ny2+TXkhV1e`|lC-`k&oxB50Dq0I@Db9bUekyx>VBMy z=3eZOzL0nKkK!6}yj3HX6>pU=g+OKtbuCPW5brxX5Bn{*?+ zcAwVDN>?zRr4~{fkIj|UWg1m)J9`{=*fA4#hYtUc8 zI1YC?UXN9HquX7Mmu|e z7L1QE9qyYud%Zkz^UThXHF8Uc_I2o=eN4EI&a3{RF-4$KhsW&5a=K z+{%piooDU1?kNH0H@vs^+3%sP_ZMkJa&jTgoy$~7eKsTYXi=;Sl3SGSSQz8B6ZQ8f z7Pq^|{J*z4{A%fvsPZMd(#1N23k>SSIut>C+N0@M!o9pVZk))~i(u#XFi&D2=|qVE z_}8`5i$~DJ{m6lniPptB)hi8`3JnuATn+Jmeg-h`hl+}#P&$fs$W`Y#h>>{s&i(1% zh1rDNo!>nZyc-!YM>9f-=^a*UBgZ%v;S<4*`8}HQ8|<(iO|PP%RI_*)R4W4!%?&H#%yBCPT;56dZ7mXssSL1hM1 zgsHJVN7Q-BN%qsA$M+&KAi&{Ir_pT6`rEF^)}AFQ;gbijof^tCX3n7lfU4S>ApRSD zhO^2-iKY!@K^H!|L_?rvrfRf)EDn(p1JkG@-thk6uy`m?xu+f2;R&#GuGr8a#0{Io z_LY$%FG!kn78-Y!p9D9K?Fn6w5EA-CbzfZk%g2CoKiSLeo6O#q2?bF$e1TO&Ffg#R zD~v>*%k|hPbyo|HuPFg_7OD76boop1g3PaLM1wOs#_vvUypI!Rr}CurIFDBrRh>ct zqwDW;0(iEN4nGp*KMORBzehxmWjnQVeE+OsPcgpZ@1<DMS17{+N+MRP6KNKbkOz zRaJ}kztN3E$y+}Scq5tTWk5YOJ^J|UK!;aW4I5jgzC`uvQ-u&m1MrI%;ZN}mO!F{3 zR(F?8m~baL`I04F^6Sk>AS&8`wLAiCSdBEv@l6mAz1E1fCLmo8H4pe8Q3Dwn!C8g_ zXQoFSUHMk|NvPw&gZ`v-F;P9h9O%P?EZ^BZ4b(E5arPKS=03f*A2u@eH>fEmId%x_ zK)h-dn|}^1VraT>euSqDT4X1#r=2g>m?0Q# z>n4PMgmPs_(7?q-t+C9r`$l8rIE`J_gA!9D^ir28gmnH!v-onKyach1I@TsLks~ocuikey0Vzz>T!0E!teX=PpgEX~_9vVI8N`%*Afdib^X>K3j1}S$^i}^} zBpmeIg=2Sw)*uabOekETUk^Oyyz?7wE?Df}g4tvT3I*6L2J%+p&dlDgjYn47yT21w zf0b}CDfPM3=}-j^5B)z!?92*TITg?CHr~UxY}l%7Ha_jOS-N1npitM|1-5V#*&iEJ zKtiPzi3H`wbHDChVl>{bI7W)2=At-4&Jm~dQFkS-_;Jz*@H4d%$j)P(bM;`gvpiGnyo@eS4k}L!G-9!q%Ch78 z>W^P~b1OrH0z6B_&4)AeMi&;%j|6Tk?!P|lpTLc6ML#RFB+ahE%J2hFw`33b$3&|TP1_vh%(|>vPwJuPu09N#Hlk9Or0?!8M zRNNe45gmwyUbgmCAkt@WOFGSwDng5GWmg>MLfReJ$E0Mu1_#bIfO{(G(ZAg&shj*X z$>haTg42;IWD|V7jNny>?>|YMc#X!}?pT&@nU~LoaZiUNW;~a**}@KPJVa4^w!fHs z89N-d6EruhZHxd%JN|%pb5ydoX~4FfS08;BRq*igS;n)x$TY{)R5dtB%Bu$93-1D$ z7(ht@+;#Ke7ivlpBOM!&MZKLajNX-A*nnzQCo7i=E5dP1PZ2U{V|Q@tyP|(*r~Ua$ zPgB?CBo6Dqs9l`Y6#6CX^HBbEKTo^7U|ejVKhpDXL7 z7!v5T;QN_DkgdtUKx5?3%dc{-j?|#J(-uzzHGivnUJ$6Ij&TBo^}JWA3^7jVE*5gY zeuvuX0=*tYb(cp#$i~jkzlA9z=EOd<>jTF zjZM-I;E;T0Wo}-I9`eQ=EtOuW`1B413fe#QXR$t>7di3zF41Qy+`r_-c|Y9@ETr`g zkLl&o6QYMuZEa}bP?ZuM8IO>ztmT~I8%B@nXFx}q32m%*KD1V>DX4`9@f4UG#SH?S zQ6KAsQ<`!WTui>$_``<$Xk9)l(O_s^IM z1=@S|-$U6ZhHq<#J*7Zi#)olcxynv(7PXC71C9X(069yaBxU0l0TVnsi|%S@6j`jo zXbQiP`Yzab!DFFOgVsvBXzi_Trf!z513d2J1x%CT=Tk;pcn`0cv=DyB&BH}3(|vzN z6#s(Zq@C}>5kqkOc`|wQgmKSe*w@F=)aL>4lDWePMPL!Y`l?o+DBFDLhS+DZ=y&t` zW+k`RV{!iLNWd2fG?%v*pUgQ3LZU+}$92+Wq8jw7K!Tet0%o+Sl5EOskdSC^T)+n3 z>)wg@_=z_g12AZjLG+ax*IWOJoXW82<#w@Zo~!H0J0EU_ga5FngRs=BPD9}9HgXu} zdq2{fFhjD%d)njvHFKK*$@*|pytv;(H`u36xNn4SJHo3_ox+%$RU7OWg))c1C=f%7DvirJM zquqKrn+!q({?>*wU=$$?*fmEyK-8XS=7bi=>2g^jbv&JY&Agh>p*81XQ?%{Dga$hH*FY zfMemG{B7|eRkk*V`Dvk$s@f&3U#$6&E?d0JET)^5Q9wKSx2hf=H91yy-w0h(OW_Ll zNOcM~QF`%hL8GSUMT#P`Zk%+d{VeQL%;Q;1K|Za9*xQ;T1!+ncb&wGu z3M?nE&lF;nEG`{{CyfMG*TO)&-Ma(O@ZW83ZAbEMp5ELgZ00y-%ORgN3|X zue4e0mIp>=)Pi+ZOx(fs4{}Aoj#ByW+FJ;bpUg7I>jIsdMo3WcOYqGG;7}qm;Z`36wnNZrJ*Xln1;s4FH3A3)uvhbU-raZgDdknX(ml zI8!>!+OAl)0QjVn%VP#ZeSTdSotZVQauXOK2NjyuO9zqKGNZ?>R&^j%ebB(MYp2h& zyL&RtZ*P?NKx^z)@j?n`6Qb!Ur(}{O8C%2nTnu*QrB|H0K04AfW0HapS^tEVb#?-CF{RVqi_qW#wN@+YoOFLI%~5)b%$c=N>9%?QQ~8X@eh z-f3UTD<34#_9k(c$p8D^CJFgN$U_=+OFLkctVFkKT0Ax-LOJNvaHKyV(KrI9cOGF$ zl?xk)Gjv7Tp)#86{$b4klq@&wND+T+KAb6!X_Tw+bH?DO>$?;aJA;9WRj_qF%+aKk zq^klC=KGa{LaXG3=fehOe858c_Dr;<4V-1n>#`KYSt}9Dok;k?DGH8*+7C<{^`|)6 z?Yl8?^#>yvW&{3HDFBB>44`dUaOsaLsc9|e(a2R zqon{^FB#{=eiS|2vsSX-1`=t>n!#)AoSmG_LC%By#ul{L5{w=j&KmC-Y64+;8G6HM z{X)pWJ(5SOACpwL@S(*H>ML>D;fs9u5aC3O+J&Ld%n`Ea)o;jw>1c4e(CObqN_Ku( zOS{tsWQbcA27=!=@NToe`WhtCoGy8;6B^!hHru6AV9k4PJZdas-*)a2#n(D(R42su z8Mi_JKgPB_>#6gpqH*N5QuxUR4T~%5&wdFg@*qwb-dp6vOOVzpPo6ZSv}pun%2{MT z3L-hpfqF$6yJ+EdOqQEw%EX~iV+teX3@x@@BslS>#bEK;DKH~TN&swX*7ux-gRx8H z&KiOr7vxI?P*N#L$C&w+Luad&#CG%KLaxN#h8~Kx>ytalH zO+Of-8ws8JW4UNwGJ@02PtPONUoudlNLVw=hGQw0dmzC6kv1W>) zo|&nuftjUpTw>G!kM2W4sw%Nt7#G-86rL}UCF$~XMmLYA|f>|YkG6BS_gF=unryr)I3dU}p>5}grS^9*^gQy*B?{)i| z_<%&MUnrN0(#TF;Kl3WLuyZ&6`CV&_*|jX5FuVsJJr&j(2|OaBMRVR)f(x!@{<~r= z9JUHp@dO{!h)SKHMfW>`Np^C67gvM&KGGCBs!)+D2)(C|o4XTA`gEK+OtDThe@&Sx ze5yg%3`ZEDLa{?QzcNTDRQ_`O2>g}}Ssil%3`0_uSHG=7$=etNG%6o@q{@#ba0s0$ z*@72g3XOqDlebyRj>Ec(y+yiN(l`p=uX@VUHvuHKv1;4Z1;lc|#6&rIp~N8esI%bIo|t*s?pgDtRiQW0{&p_H@c(*ZBGGTJ>6DoFG3}iRQpjV|jbF{QWskq_PI``) z!nZg@5edKEMCSItsVfL0zirCNGN`B9k&_oF7Cd%96GT%cb=7%D-ZqwzX=qPw>7yv5 zQr$ePtvoQk1p`2ybnNQ}CWz;MmOjM*BuoCf*nRk_4y*iK(;7B6B1bN!NP zk3WDi;Skdv2{;0iX4jjXrA5 zzt(j95DPRWfWD^U)GQNxgz zf`d;^QqB3#G+YSv@!hDw-w!8bDF&)^>}f-nO-zeP@$#^n@$vBVDpsJao(PT z22SdVF(h1bGQ)(HIGM;&SDNwkJD%S6FuimO*61Sr*v#byhUqmQkW~;$TN}GoSs43Y_$U4g|N5;& zKs7N{Ni~k*r|*lqsy`eSM^wP|=D*(H)c6*DDzxlXU{T>+j0bF%;Dq8+ZsBgKf*r47TnE!=$4cYyn2LNq%6xUXWp2r<w_x@1zD3=m0J9$g{sv!FuZcDhIS_E9w!7?I3e|M4jy6aFUb zL12aStaXKy=p|f+nmovsU)|qZ>7_Os(TN^Og^_c!)2CLF>Q;5l56Ofz=?TqEBf0K5 zyUxLl1y8wHm|u$@xBhu(l^5T!)yOGN81Fg`{vJJl<^QsOGE|B9{l#MJ{8YcE>r6 zC1C&;8cJnG_y?Uz07UuN-Wk4q!Lk4JGE4;6P=$~UFcWsF#^4eE*!VF&P+=9u}J0ywAqtWBzt#MNf z%I&Pgo>}9&jK@*3*f|UkTWU5SM?%Volwk+gn5 zCJBlqdS~gHeM(ZinF{9dG1WiJC94wZ0r@AI3e?i3$}_YHeI@Bcbt1_@Cb}VLRZQ); zu}NdQ4TIENIr13NOJEHTrs%r%YOy<%R@Fv9qWwQ35>14zM_#}q&Ce<5ZF9#>3DozA9`C}fi|Ul9qO(JI!iBXa&U7-@%SH{G?&I8XJ2YAEl-$# zFRPzf%-O-%vtF|2(CPV{KAyrBbMYlSd(y03_gm>`gTeM$Yz3Pf(A(=+#s};xtJ`s` z+vWN@UFH96;vZu4y?NLRQ@@xGeTie}eZRk}Rct&yyo}fp>x)v~h|BFNifU4~=l$CK zyC>*X*;>8T`!)QvC}q^4Vrg;Oeft34OcRxj%ki3DTILN=+8>%Np^(wj^XOoi?$K*} zIXpo@V!W4X-(!JSy58m1n_r$?`>@gDS6gfkz=756xw-$j)o(rUgnkVgwb4YqILUxq z?y?CJ#vE}3Z31%-6H003>8E- z@34vrz={w^ldDfYjsni-TZRUgO~ztQotfR8nCQ$28p9EOg#0TyuzqMq)2OM7Lm(VK zlOlF%7tQKpo|zOUFLkRz=oG$DTr^7OzpDBzRPDC$Rb%mQ?8-=*UYR_e;`XM-FcHXQX)K)uzlBlt&HZA-{b`*k8dWQF7FyPKy?z?s zwZB8FlfqVn8(~EWB#)whFNe2hy!^HQJ)(di!yO!1&3zd^qZrzT@6c-U2hJw0=W! zt!_0X0^}fdA^z)>Cc|9O#8~hq)rVn8)(y?8R^9W?asR|EskN~Qs){d{ZwpRLwX7nT$9O#$r7&GBD-) z%JVGDW_GmaE|K>#Vg)3#qdPP9Uos20625e>gB2s9+kjgIx&N7HTW|l&Ln7y%K?gcT zp6_+LRD+M5(BBb{>Np`G$n+c%lCNcI3+e=lT2Co%;S%+vTVCKkspYNyd*L%|z zSiuC|?-s9+P|jy4Gcu|&b!_tVyk40Tu`=X|s=F+}PCt#c_7>LkNvJ<)fs=8npEogH zusVV+s>EKl%-j+}u_GvK;6`Vh+9^S<4pvd#hc7`*w!6FVri|{Oh82@7k|L@@j#0+j zqxcsQdk|({WG|7%gExb$QB$?{mD~lL&LW&NETFv_t;>j*LPNUctp5;b-xBRzAd zp$!(Zizc(!ak&r$CBq?UNPhw6fOUo%8+Z^5k4f*JF!_CQ@`SRtQIkEuiOW$+L;0sIcFo ztR?P1pyTcqFcC?UnA;b#&78qf6n6}0?Cj*rUrd|$`kNVzYU3A%^^3S@l;#XEy zjjs=Q-hR&T-fK9sB9T;`?A%@{5NoryB@*tqt%Xn@&B#HHE zU2RlrvInMJE>R_)THVu$7wQ4YDkpV+Dip={03z*p@$zUik3TqbIw!x)0|>%6ezR+3 zTjAWJF28NZ2`NPOwY>`|Z^KV{2JV?TQmn5SBPQ^y>nT|AXfAL6iZ0(}_f{=wf*7L4 z=|bCgP&0LMHt}z!R?QRwe-dt3Tr}f6+5S^ z!|$kg6W@b>wBx1;QNrZJ*Ac`swAK+6>A3%B0IpJss8J|fgU%!hZ$^VQq7>SWRn~|i z931B6hnm;NO4_2u`PH#leu@_la1*iIW%t-~tZ8wsk6H~gGqyjuQ(T^ITFJ0EKV9NT z@jf%&*yE|s$lW}igF~RrGCX?6;^fVoB41#6W+3sTk3i#EVVd%4x%X=&RWBnQ?R34i zLlIH`zG8f_$I-?42@WP^j*Fz$iz!Eg2sL727mT@Z%aSF|h;vs}{tC>^1)_HTq@Gls zAhMnQ@Q#&#nmJQ;|1?OL-8v!v^cXJ@kVF~8iXG>!V2EWh3mV28a0rJG%WsP}tOzc{ z$^;!;EY%&cd%1nwFud>bS{RqZ&ZLU(&pE@yxmUOH_OmG>!7-vcM5xxHJ6zucj5xP% zzmcn7EF*ddjbVpNr_tZY#Rq#tUv+ggV+}f*4Og9fv6GTCV>&}8k&+S)K^ZN^Tv}!< zgzImGRyB^8vL)^fjOMli>WVN{D8P6dnsV2RQa2);gfhj>(a|%ZLWrT!BWNL%EK86u z3sY>SjhQ=&LX`^F&i`zi_c+=>ZWtpXNjiJwKwO<@1A{+oi@RQIo(<5*ksMUwj&SQT;rEgIf)_%zT6BNmSAn`U z1e&b3sz;g{e-^$3SkWg%2&ZeOZ_D$yBp}#e7(r@B{d^K{c{HuhgdKW++%WQC!J{Sj z(e|{!NRM~sA(#;7b=ayHDqAuR9rH(wWSWMOJl_{ib~#=ySyCx@v={{*NZ;NJe1G_~ z!4t?~LvfmxZ!|n|Bg%>Mj6+|Z3>`aJB?1@6!+qHRJwDa$<#XR`u;d_E`77oIJ7bTr z{8#ufNN(*#qZyNi{9UnriT)c`aY(OLRdIfyO0@0e8YqLIp#2V*1$@)@(!L%+Ye+d? zoM{8yNz2_fV0T%moxGvslIUR={u-qXxwYi9l!N@FmfZyJ#+{X9%ee2J-j%hdBb-)fQ*T1z_$Ju`dHGYKUW$o)lo<1 zrB3(C_5S6acAT=~SJdN7$){y*#t?axkK@hdQLY{oL|0+;MLXR7XAbnee1DH{0m~5t z9zv>tp^0ww8jV;u`BC4<6JTu9Mnj|kIwP0O>%vS$!JY8f&X&Mub~+_)1;YDHfXDxC z>`q_%;?aDH=R1P(u)SHm*tT*f1_zQRE+59-fx5c@zq<%SF|WrWxpr!D0XcCp^rK7; z?lh*X6}p>h73Sr|1J)uWIU`l6nU5QwL0UsokO4^p*7&2Le`)sSm(hxa#rLXW<0dV@Oy-Zvq@=C=XGC?<&BtYVnvq*=ePaT->RwqL zb*_AK-uZF)6h2+rY`4BhAMrWI2?_OU!{C6Up$n&NI2R+8yYc`{v7UDBSNCZ6hdhp% zm5qT_y`M7GSL=xbFVU+7)0r+5Gd5toHc$7zWZ^oGT7Qx4HfS0sn`V0aJ|~dengm%s)Ox z5qe;)>-m!jTS6H`Fb@d{&%l7d?~0M{&0)ZCUH89mnNw%IBk;2P<;F(9)2VK3Lh_#Q zL+E)Mz9*(S*G6J(Mne~&zc%GxcjG>|9~-Uqp8M4>x6slZNypK%tha6Z8TSPdx=!7_ zzO3;A=yQ5B@9{PWb1V;jgy7>haII&;86C5@C4zQu_8BB4tI*yHwsrG!G zk9m8D{?F(7{{H!{Y0t-(iJ9tG;4ZJ;PnlmA?x_|mBpmj<=>s)E=!#LubzRPdIj4b~e7Z`<3=NJyy9H=jT1HANju+di`Gx zKO_`hSpSyh>Ru3NF*<0bUfrvq+)RcI<7}(N12@1K;0MDTY^Lh%<|D60&bKkk<^)2I5uCq zLM4hSH14Z^)t+d+jsJ-cksm35RyzM{@^$@wKI=v-lz~moKu=eI-mkTA`~KIBw;s)* zwJ8=diwN8joUh(M-!!aRzIBoiL;B{9#-LXVo$S=jlTE97ww<+mdU|>)zn0&B7JJTG zuyPD#4(^rO&Zy$VlffHFZg|c-JQXo^82aB+|A5Do-s#2W{_ywE{?k&xvH87Kp|9ck zWXpL=uoCC%K5j^X!3L-t(53fL8XV~$`)WGwMCnv_MWCQUBia7l;dQ4w#prn;ccf{b zEM2q}uX#;{ypDTwoi-Ia7Cj(822tr`I(6u2i0DvEmklLD|6W|SqUAB)XF023{oz}=*46mkYB=ezd0)}qB zVFMl%62kJ1H`0B-f#>kUUX_3b8F{TZYK0UYxEaXvtC)M_Da1 ztX1pUOGx%`!!CD4?fylkFF?K^AcHNlkGV+oDCj1}fbiszN^NMnvkLjzYRIY1k_9!y z3E44G5}P$+T*;IEM~nt8eVSul*}n~d&3~49!zSe_ z(#iQNLc2rV%W;IBCg>u-Z(SA1k6hjaOpJE9{=+(4y|&V#RUeBsVYYPWY|kb64l2*- zU0Wq>++w*qOVgkRkN_#?$(|fQA*|u9}qE$ByPWODd!ysGBfG%t>pT-0vl#zk}|q` z6Co$mqe!&ZIKx>3NPRsng!SQnYwRTPO3ZGwlSy{-Ab#nFtPV6u7*2Rr#z_~(8j3F& zQ~f*pj%>`Avt@8wgvfK9cMw4~>38JbSprplOK&e{d0Vnl$&9UVDx(&y1}S3{TP))e zXs23mC&7%`vW&uzsK)rgqGDb(iYAFS)BlN&mLdo&-z9fNed8%Bhvdvd`Ri`1NZNTq z%5+aLd5Ott+RYF~v8=EAR@W$)omxs)7w|-My9+5Gg|&vc)iDFg)o_Y$>4?qK!D^v-BF|QJn_L zggF>eDwX8+peo}c&SbFQN-2Vqppb-}NDKkva&=(dAg)55f$>){B`BeEikRn6`vKIr z!AiIXC!s(cqy|2Rbi%INf5wKv#J!LoeoO`Km<4*P|avxEKA zD#Z;)(4v6K;V%Ji|DAQomaCV7uUTIY{Xt(AbF;~)_NVdm;5VC+;nT~COCxcS^z@%C zq}t=-(daBJjV6JnD&1sb2TtYX9hIGK7kn=<3MN(W2L-YR981#4GO$AE2Ne=8PPR6I zApDD)<{v|=eRCtmp{qm|pf+T(R`r{9vB5*GHRJkO^xfqYmY>1h1B+qr2JXEJyf$ikN^8Gn7g-`qlVKJ9J_MW6QV5t1r`dG>k~f0&x4ws zdMw4pMRdP+m*>S`M}69t>yy!sQj|>-yfAxjCzA+|)#=aaYg)O(EUetF2M3j-DJ4mh zc*QGB!JAF2=nW&^X^th1*wI58g`Akt>c=-kh(027Ru)Fii3JaHbM<)1UDPZAe*QNL z3p!O=yPx~n%4yo-2aj4X>E}DsT74RS zHw!P)@M8Ogb+R3TQT;5-#MO!=e-g`0a()jO0WO%pQshl(EP26I%VfwCtu2OevyvH9 zMr8pIk<8sfyJInDnCywAn}e`3Do8Sh=qFXOJs~vKU;NGD#@`eu^M~g+S_JbV6e*c= z=n3aSRETX2ErTi0oy44gKE)LE>9nyLt33$YGgQb@vSu`)bjeoZ=;kT}(v*d0`jjDu z*!?qbT2*T$fIjDiONU`AhJB;Sacq`kz?2aw&}2v}NQ)syE>O0}NI$fT0~j@`HWpPxO=8OK_dc%Y!W zM~CBq3=gaByxZ40D))$CC#|H-`t8f4U|@sp4u^kIPapR^(w2aZPK?!vkX(oxW&W&_ z2;f}3EOhS*b1;(cjgDrFqY&Zzb+m41?Z*IXcX4No3`ogiixxUhCZ~jOg*TC6BMLgh zJv*SwGn)Uq4YRX``E<*A`uPy2fs0Ll`riOBiJEbCYnygz@9W!Rp$oq$6RRs5cP}e5 znS%dE*joq1(T3lG2_d)zx8Uv;+}#Nh+}&kxw_w2`I1KLY?mD=;ySwX7zTe$jcWbw5 z|9oemKSC(K9oEhnN2&Dx?*EMq(FAj>0MTm*Z+T{0gbV&5s5JEGER5&Pb``N6Hqu z!&g3E$P8R#UAx*-2I$0IkSmY9OiTHzCV9CtcLr+b9!eL+N3Ml;%hH28_c4f%Uy~Cm(>bHT6E>v;I0fG z%9wPntVeCThe4}h=7^EazPV`w!sWN|n-*VhNpWYT5q*m_y! zeO{}^6TL5ugnI9{-B=Ie+fR#hQQ~pOlX#A4rL5Q#cHg4pW~Dhi_LawIv?#PvaU2S! zqk)kDYdr>c(|6r;Oy#O!5_Ut{Td_9F`V-1XX>`?3z=vDkxklbrId7K0x*kJh^b?Yf(SYWF&J%)^>C@TVbV;4N{C-X{!~+J+`Q3_808Yzhj5ClSx{`*t0MvTaf2sOpI4Oca-$qQB5WLbxleL0b z$>7X}YJ-XQOOJwVSQ3RH#AK0nt|{;<*@zqGO&cZA*&_?sp-CCgQ$$cMtXbWc?#&b_ zV~1!mQit+SMtQ74>05sG#f{vllIqa-eZz4pMjA1G=>?i#F6=j2^-zbb2rned=@$0k zY3XVRNh6vQ`1*WNUL2XQiHkvhU%uXsr$!f{0$n5&V9sA5uq%-76(!6trSoLWFS!^N zn(e|ZLKUhRxPkg^S5bwU+pF0-#@7Xv*bhuGr`SGYwfceW3|a+Gi6dbGfOD;V6Au$h zXA6rNOfUvR?OFvAh1b2;+TOzTtfo6ZVU#Djr6MO5K0yj0ehLlS$baqwzqMXq%LlEZ`* zNxyKR)Uw$M;w)Q3OI2|2=MN2Z3S#43gtIieQoiUNBl14=`tMhupxBLrmnAFl+3l}p zNW1xs`b0yo&-k!lyjtOO+>`->+do``76Sf;JbFXjl>#pq|Nj=#DU@2}sV5*nueV_o{zM^! z^RE~joE`Ar zdL3TD^v~Hw`ENhJPi+a596F4B*;oos<>WFvpC6NFj>(Gl!3lO=WAWu9YMEFMng`$L zQhU%#q_*!TJYDri(hI|K^=&_RA8j7-P4g?KF?d6A;hj)<;eNDu&Pt)}p3CP1@=d>w zISZ0tGO~?xQ@9pzht=vd(_n@j;89`)eqYpv&0v&GK>ixl*Uu@onMaF{MT&x=cQEJ) zn7kD}v6ZJzJs*l?np>XbFlgDAh{$DL^I>=9B;q_B_LWbfY-i_M0d`=!-`m$TJs6hR zk)1x&h?Qgr-rq>bP%S3Tqba?>NyfRQ(fLxNiS<*-|$M4qLUp{MUn=FKNx z&nq^Xu^(850#zhv&RKTI?!gWM%c}>HE)xa)7-x1M6Sef#rozePLjtLP7V|Z0V1Gs& z%(EKY+jqF2o5LClzJ`u2R4lb>vR|EuKi&g6Z6KJr#XI_>qM&RHML&=cJ6%W2O=D?- z*3cA7z-6mxJ7dws<;YKzu|Hk+!=2o(XB5t{7!cz8BwT^vqAb5BTjyV5h-c}P=pM|5 zc96xx$8<`hTji395}B&;_l9oS!}|qEs#2b%EGoI$WOcCd{uEqWnIkD< zZ7h>8*iA|hJg`9G)=|B}5Py*)<6V|3d3=u4oqp9WaCwEKXycGZkKLbcMitW1$!<+l zXJ3AfOYg9$$7XT@lFq2_E)mGhpnhJ#jB>X5^z^D&=^w0jdNeVsiAehOr8UGP1cuoxx@GL^@K^ys+kq~eDO0jWyVq>>59km z7rvu<>Z)rs_z|aM{6PO~YZueGikX;Zr7%_=rZ9B^4Muh=5-rOwy=z?#(w?3R9{MR> zE@{NUQ;1$b$krgKQv$sHS@ox?rdAnM4{C@xiVbn&VN9%VP$|F1A6veW;xy5Qkk5ZiCtp1e!6M=rBk*VN@0bnWwBz^D=KRZE#RRq?7H8rdt z<@Hd%5BB(49!(VpzJI@J3)!EAmw^IfRmL`>i?&+c$3EP|F838u+5$FZq16B%B(6BRMA9%gB?X<&(m`}#)KYc6SO>odU_v`deA*}l4(gTacLcX4QQe7U>%Eq~*xhd$ zt;aUnH+8z^ITJeX2^5aR_j~NYMj)f|`$`&J=ixzX)^^r47P|I@;n8{}sO^LX^)P4j zo4G)zAK?xa|M2Y1Z#c1bA;gsEFF9!jh#B1*Ta{niV*Fs$XKe6YXGj?LhkI-0i{U5D zl(>n2s9sIwez_ZVV?!yz_Y`;|JYJ4ydp{)kp8u-73=B7h1i0hLyzd@8S5_jt?*|^_ zw)43GujeCQ*mI3N!t0rM!W0)iZVxIuTGk$3N_YCjWrBexZr9TxdUs=GGxXJJVJc7I7mXaO#_7&BBmbJRuXO*L$ zVrLa}&nnhWA^DZfwT8P^GK=Y#EKAg2(pOXsbmfkSJUL$P-HAE{cUypovnju-g|&VV zpDV#P6mT@M|2%S(*=>L_R6m77p;mOgtD$b8jz4`S`!n}ejB&g@%DJ%M<#Us$ zp8Is5x3Q!P%oL(lmtDpUc5sb--U{5)`&hXHH@dH#n_pS59cs>_Z-J|aC6q|L_-+}Gbb5MQt2F#27F*Aus=}s=tS;x=%)v;#uf}7#vZM~JHuF_8 z@uiiYIp~;H6b}W^Pc<%7AT1iqOOy1kv4%o zjo=(-3D5NO#~sqs!(Mkt_;;-{x@Np~r6{{Ar(FFH)r|Ef)_|$x$p(m@AjNnufUG7q;j2oBwxqsI!nEnxn7Z7 zLfS+|8I-r0Shb6X+dPY9e@VvUf9y>zzY3 zErs*GU|-n+96CiYmnHjYm8hjMZ&Wt51xc$|Vb}mkupmx93tpr+yBYyKySet<0Os0( z>y4+7L#s84`ku5k8L`)Qw&eKC$z29+HAIOx6}Vr3haueIZ-+`L zDxgA{o7Pq+Juxh40J(U}C@qGx6VJ8rlV6V_D$J}oFELAta|c{tX&!tednCUGSBz#& zmPOjss2X;DL5y(8_&lDeUMlfV7E#Pr#ay*RR7T%+-0d^>(hD~qe7%n-XmD)9ABsmo zxxm`k0V!ClMR|B;b>jH>JtBe0_VHpk{fGkW{Cm!%TRAk?M#FjnM`L_^rgppMXlL+R zfOz8+6dxb&R$Ux&2}|= zn}uP+J2h(FTl1)ajub)Fz4CkhovX#ApYF&?3b&KO!m1vwu4w|;FT#`D%v~y!tF6w?= zVO?kFw_*F@Sfhc+_3jHX88USeM{OAv&L?PDJX@#M)UeJVTIc;ZG|NS=5AN!u)L59xGk$*)ws&xo27%P|8Upx8%wEHjKC%%<4M(8 z@Yv~xR4CCWH$shEPO(cGzQB5y_HYYI7ZoHbwn1u?vUc8kD1}JaCr9+ z+mXIhnRYrbw{+mrsgXKJuO6^ry(`zo z*%t@vUj?S)Lk2zlEj^YbD)8sJV4f6A-70cY;D%r4>NpD_zll=2u5qsDT>fQH@VV_)szj}brChO`$)NMXpX zwXM!Pc(DU-t9$l~>4PVy&KIN7r45-eo1tRPeHYOX@$$2~P!j~0Cpnl|nmd>(Yd{eo z1kPdosRB%WfNvQz>7+e-fMzfS(1RDwbFr2!3a$6hx@4JYf~knyyyw}8DAV(|z5up5 zN*D|vvg{1h`#j@*Uz@$BJ}?0o=wfhjj-xkVw(0J^a!-^TCGXMDOyJm6H?+sHT} zUo0wWMbjE()|Du6%A7y&y)SGIrdU^4EH3QkUeqhB80rUfASNVkt@JL5fup}+fblYp zc5k;@K@%JLF35Et`qsGl{1ti)T{5?p*>P#l9Gzk<&EG>j2At?P#qnTFRHVC|EJ&g? zwsx3t@*O*deE9GVFu`*xS`@<6!m!T!=@hSFSrfAva6n2Ls2uJZykMd^OmV6qu;2c3LqV}k=I*Zg~Zl0qgxIJewm zo>vZVr0NT(wNrO|SAg_6)D`~pOO5s9Y!))kKy*jrE+Qot;ah9P{9iB@YF zE=piq^IWKJ**MLIoEdEO!VlQ1QfTM0$%E2{#7iQKK-=XcJWtmBcuc4>gV>jj>i%Fpfp>V7{ z{_=Js!x|4D?pC8hu#E{D!jVxSZhZ2iG|>K<=9i_2^`(Cm{}M7*Q<-l z>&^i&g=37i@JbN@4u7}J+aJZp!+W<3Y2das^8m|M+SQ`d#qtirmvRqe71uDFDVWm~(>i!(Kd{QKWa->+MG3G!Fc ziuZo0!Y8x%S)W@IYe_%*Q__N*a&_iWqnbqs0tYe1#97BIv(#@zAv#1kli~b90hP&j z7}peyYq8Q2tOg3)5Z9a#^2$^wl}U2h_Emo$#Ca3lXmrg9uZ?T7#(NB;Z0aFL@&#!i z#%a~5AC35pI8&)8NS?5h#WMH(AKjlEfL^p6@87{Kn)oN!yKM9bCxESpHPhxjh;80~ z;n?~}{CUaJ_I5aLy)_NIsVd_{1*!`EzUSM6P1_&Q%! zo$<+Q)V5k4jZ?&R-?3vKG@nrU9PYVM1$lPU@y+bIigxiUz&p@jnP-DOKTv_-u4x4N zAT|kKr-fa0(Nl4Kj8BgYqx0y57BPgs&cwEGWNyjCxWy%4Z2;CfDBL}cVMOiiFuec3 zRIShgDn?(4N;!P!2*dE*iTHS_*gd5b_u4%PG;lNeT~a$z(gI+1k^#0AH}otsg-H^I z7ZkX=!2{f=rN~OYYh~GQElcn52Qq1Am=kB;alqkUd3oFVSi`Zj!Lo$>=6MjUSJ#*IPEzAs>1{f_r~{hE}IOW*pa z?ZvUAfX9POwtli;zoGi++nc#`XQteDBzWZ3>&%%wsY)GCP2tE`d{F=07U=7X?UB@m zb$09-&Y-#aW1&cC`;HX^)ZW%jKQOi#_V3~r6XHbAe)aV0`T66n<-`qjM2md>^nfWx z5erAr&tPCJ)`Jj4xM=ivMVy>s%)AuNwP5v{p`=1xpP+ExR^(U@1vAUybP2O^8h(o0 zuc&u78*6J*v2EG+9Y%pALyPyLOkX>=gMxhn(wR&3Bb1Q-$kDR*!6bP8LT@iyBcyR_ z@ErFuu@Rx5`~lG11OXXM$dZ=}!1N8YbHFQu)5plSX5HxdxryngEy0AMOA{S`&^QM! zqIt99*RkoMuj^S!v{S`iuqE93Q#1%3^ntXleKe53;B0_@O_+HM?bHndY)s;1KU+)R zS>rbiK*Mx7`X6(A1I|{NEsL)_{1JT)C+9F<1}Bdqv{Oj_+VB`S`EMf>tbw@2PFP2t z3|Wx+m0-%JDEU~0tssKBuj>dPaN5vu{sO6>x_mxK-H z5}8uUiNYeZRzyksh4-l+x$TwCYDbb}+@M12qNGGwDAe#_#E(ewf2d?JlS7vH$@Btl zg<{5xl)A96(m~wew8A!(X|ks1IxWG*`c(*pb9uAWLv#s0385w!;k1OeN?=08I_86N zLB??8Nwkw1bfl%Se`b3QBtdK)jNiJHjUoN>b#9{4Nu1TSKj$hniD3W`K8LBx8(wC( zgiMmmt9OmvFAsuWMpC{oWyitq3g_PZP(R^w}x!>uGCbg-b0XgNZ-qm6GzLxAK0`A;y70+@#g@Fhi~_GEL%2+WExj z=hHentG#Zn6Ap|@qk#xtyGTFsDL*gp`^JZ#D~hCDVT?QOQKi8&D`LAHkB$_fO6e5F8QLP4@2(B54i%=B*4~~03xmV znbSm5Ixs6;&>2bm(c3}2>Ns8BB-sKHnF8WLY{`%S`d&e=xjwKiqNxnBosaYlG5$|F5psZKB{j1lZJbr+~G|*y+rJPb=GM+yTf;QSuG+U{2 zt(BXTxiOwMFPlT60PEfB$Y7$j`^9@i!IMJD?RL&AJadDf_4VirX5hR4Vyi$$MyNQ! z9X+oXuT!J1qp7KZ6RwMyy)w0_fcs;a9e^*@PPc=Hi@P>LEy%_aY9xl&>UNLQ{p8&7 zr!gk^xN(mHg=(djyPePXm!mQNsiR2p^xf!80VmP;XhJ?Az-=_NnWra(_SM?f)loL6 z9+}~x3fuY;#_iFZNmwT0hj?gYNmVm215To2rZb1V07EP;k;dVopZ(tG*yT8r@ z;8!cc{T(L6r@4oeG@@GMwt^0;tDpU?2!UbayBrE9ZsKsWQpkj|`CDOp zuMLet8G9-3(^u@T4NR0fRWK0rQd{YorrD|n{?=&6?T{=}L;1}C%ZtxN*8|Dm*XK>TgK_;*WPnc3HteqGzP+novP;zrzt<8w4)lUI3Bvp_Ac0GN-S9id7 zjXm*iO>Vqvwj5yyTY&Olv}M8l{2#9r!BJv%D|F%se2xCfslT<$WqXpUy+Kgv70Z1$ zUzOK6cWIl$}BfCug=y zI5)P5%q~#kazdIgcA(MW5nr&1zj=r!{NR7WvH75=eIkC^h06sK0=Vtj9jn{iigc{z zL#a}EHQw(XKB_Le!{bCt1-kfJ`93=@yAwi_Cu{rZ9l7t;qCHWP=cjY%+jfD37a+pH zg^nG6KR-9b|0UDxfe54;bJyb(EXoCs{+CArrNEvhC)eg(Ht7~y^!_)mq_Q6I^XDt) zj_!B~2?_0s>?bQB*=HpBZCh?+BgFR zc7D7Be!OP-BFQ5JFFb?CG)!%Q4VE8_Zz}1hr)~dp+(jT|ujRWUyK9H1e4joYrIJoJ z!?nC;4^}hw)hV{i&Qf?Rk}dNK(~K>-aSg#iOEd(oLFUHxIh>0_dYI>JVmy3o%oKXn z(}e4UlqTJheOW@3S?^Va2-v*rN50wheR)ykcf}7URM-&MZ;3Lh-Z8)399hqun&_J9 zMdr6NnI-}}-VQi$PM4e$NPH=m#u1IO`4iabSzZDU9QA%O`EX!xjroHWnBDGFfsWvx z)`1RJ+K71s5MjpVm!%x;wkJm|7hQgE<-#tZT&~O=GZ$6pzbmWNY^I}fP6h#Y0m)Ba zi@BkqfV)aW>XG$2h|_Ae5d?e7z_up@hg5Sc>JXzlNn^%@^5EXDA@9*iA@JRkitJC_ zb^>e~UvfDr8A+R8z%`a`mM_*62Mw<;j1}y)O8_eEFbct+-TH4=maAb&v9#M=_U-BFa(~oLk~GvMOZrRS z&)~!ugvg?>Jd#0Fev8c9tr;`^L;Y(Gm73KhXnX^F2?C_D`Wg%SZUw-TC0WfX&-#$* za;7jtw85|t;%S0=?zl3N*aO-XfXwBut=hUInTrC?Cr7{mcbnV3W(bDDA zBRV^)T5P!hYYloU>sYV!iG^Infn)7?!p}+7-y-MZEhJ#}jH ziZV9eE4|~7BZ2zV);sV+t{JK1=$yagdrD`eu z{CdL3_+8^`QpMdELWBWRvhU+ur0??_mhbb;k1wCOm}@Q%=X?Jycz(P;S}T0a{Fv{{ zrPTAj+Z;Lh60)SNL?4&o0XRQe({c?NSa>9|$?5rijv}e@R^iYDMP^(Ds_gLadN_(R z$E%iivAN|R{Yu*T+@If{GAHp?s^)uhW!4DveFyyrl=c4T-n>1;PO(aMTLrh%y7he@ zF=2)Fy&HMa(`~`IZp{2fxE2^l|LK0$g)6nhgFZS_R*u)JPCCJVQ!R7dCQlcyaWGNx z%;ti`(!fEYtM(lGhy2JrCLTMpL^|$G(VlgKF@S*Y#Y=b_z>mX(jU(lceC_dMV+xv@9O7g0o9HVta^o9MQM}1;{ zTv=uI52c;O86jp%9g=xwn7XBPGa5{B;whP>HXAmKb{L~dIq4-YBnd=I_Gw8-$bqbS z5{iL6x)%A|ZW4>3CyZ~FX)Ww2Pb>GkVJME5gq>d1Nne20boBFBrv8-C^91;>+gQ*^ z6$Bv8yP%-Ajkio9)=M&MJgrDWBZKU#*KVu3wrk`2ndtNMakAP_^2Pb#YYMHw)Z<7V z-p<#%{IUS<>i*$n*@*%e-gs`97!=J zEA7a@K!d0N&+coX(P;J=J zSmcpL0z=%x(}$B0HDTy!KZ&DjB{ZFFCAQpV$s2DEUFw&CKdqS?Lj%jXeO!gWQMoZg zf{pWUQ%9KfLPl{6l_)5+@Y{D{JkZhoQ)Z@(Boy>6rYv~!1QhtjY~>g8we7O+RNrE& zm)uIM5oxch8l-mKWLco2P>|ySHS6jUfHr=X_aM-*CdGEK$|pm&`ZXnuM|u-fFf}`# zoACX0Z9}K5WCzsdPaemk&>AO1*J~h?w)E3*<6>2PxvzrM{v?f#4hhnTf;!Z?vS(>U zYfA7_JA@f?o<8n?NN&stl|7Zsv<-tzTjo+VL|9apT1MjD^HaBRdCp8< zCSizpzAK9{)G*lDKn)3&DK`ZC*7mRs?e#h<`cRA}@sl-O5v3y*@<>Q65jC`wP)*q7 zWlew2Q5SodhMHfYdEE>}(1C`YWT!4OBbRSZ0o6gmq*ZvOE6`U%`7+VSHH?f8)N~{| z!`lajVL4iiIrd%Y^aPP3DPGO$TK1=qIzF)RRzIGt4Zmd$txoLA1EiSaNBZKCS(6IV(qs!R;;F*?5*vw%>9!@C&H`Msn=Du*F>&olt{PhUawBCEnX1gA zX_QJ*8UKM}7a>k`!p>k1GZ)CP$tTgZdWqER-!5(TA`n5Dvl2tNx22;#xV)v2(58)k zF(hy8uz$8J|BJ(BO#m~c@MdXy%C(0H3UWX8<7h_mf`b2s(3<=q-h zl5+j4-{|7gXKY1d-$Jx{cWB95LdBI7^0mdGi&!sMq_Mq{Kqj%nU9IAic#{AzxN3@u zg%*q)&FlJ;kB%FW&YdNJeA>4=QA%$DE@a@$6`9+c=UhT&WQA%S1oh=^|Imaa%PDt8 z%Ezp6Z$;Na0E#c#>raJu7466WTuBJ9ANldD*V=Zg?2t3l{=Z405%%fj@mywlZmX-7 z!=c_8*x?Jay9H-ozcUxVdGmo~#@2m2KCqTpW5#rP^CXvz0=77H09gyJ){9dql>UD7 z(NR%I|GARRZfFI)0|$Ck{=}OG|%k%y6#}$0XSXg>Z+QhjxoH> z*x(U=b(m1Qtrx!ka)!(^Ou?%i8$Nf1>C~U~3{#rO3TS@O*k)lu z4q!R4g;&E8|K9EoIB%Lttq^Ooe_&y|lC`rfp)@1?g63-*$V51MiaXkg>U5rh$|ELJ zRNLD7emmQ7p1pd!@3Ul{p+hsdu5Cjeu1w2w3E)%6I69AIB}ow5pm{8zuh`}XhrjhN*X-5Y6GKkCx417##h6(jJaF}C=$aO9=GU2P#R zp5aH7jAvzyH^>kI5tVhMLSu zLM%&(3^(YX0-PH+%3lhXxb%LueP7}^YT*+^%n-G>fMoL~_z1sL1-6mf?7@XhZwk?P zlgQThy?e*neHh)xQUTP<@f9ONbe<-TuJiobj)yKV@Lt?#2<0%J-x&V%ox7y`TE89> z_`sCe4s&^BD?pLiH=y>?%RZ`VWi|#f>P#dJ6S25mxRe0MP=+VTgiIe`R34WkTmffV zTgf2IY^k=sqm17nV@~O{e6LjMws;D}%Ko_(!Z;Eb`^T-KiNj=Q3^rF&PVTc7PcI)= zl<`t`dLQqu-LkL}d+>+`mlh7qaW*7&K}mOyURlUczMp4}_H$g6e#OLCl@qR~EMH+v zFVRKywB9TYR!=J~8ReCFZBpq=fU{+4(St(=(090&y>@;}q8&yewag|AV|5?N&@qRJ zf;LO5*c@^^j9psl@48@iEH0%rRL@2am^@|n3J5a^C24Cl!j$laU zl}N;jt{b{;)!DY=v8g!?N^kB|c^VaFj)bRdN#)ZX!|df0x6!H&qYumblEe+aD4k)p z+v3SwNQA3Ym^ZKTe!lDUI!{MHMB*}RC1PggZQEgNj-)|V3m2SHygbuyvA&~#FO1TZ z`1xBYVH7iZ7k5c`j%u%ltz!3lD}FF=UcEnSb5qRUoaG=aute9dU{EnYrDGcg>x*tX z=w)o;#C1T+Jr3W)At}*&8(>Y z^6L_`yK?9*ee_;j;O6zeig7m!Y8MS!09*o^9oo!&gXf}I10cq3QU%NwW6b8OT7hd)AT_W(edAV|T zE}){tSQ$r3cT-RqvOP{yMT}rr+IhJzU=Jhlw@}Wc+C^>R>yGT0bXR^{{<^sAvEx6H z!Nl!+yOB$wHjkROADQ79H@19W(kc;XdE(UMj+u_t<4<};FlY1t z=%)}Xrc4^HOb(T3ll|n*B`ZI<;?=0kgXJPi>E;RghCny1&WYgVE@kVK)mIUQ$gOPp z#RN@=GO+Me2Q$+%?voai+ZT19w|)k_aV#6Kk5|>j*IcHrfYw;JV3@f^oY0H=;1W_& z`~%9w%qd8=KU;$gUCZ*4Y^4J4C@sIoz(WB5TdI$0Z#?=(-6~D^4+SO1%p4YfVTKv( zn873b&J7)nSdnA-lxx?~?{psPW}I%0fk55h<$Bq_62ipTiK6;PGp#R&bBG6ufVv5O}6gI z7TU$)ImltnzH_U;0hxZPu;5^PZpZjg?UIxGMFh`$Ak*gtdSAZnlp{BYVKQA)6f=2- zsJgdD09%tV6F+HDm~;X-Zu66_dwckHl;n@g&iSXN1c8np4K2+LJ@ve9?0>qLJqxES zgPyT`TcU|ByF#-Kz9nw%a$!e;(7mq@XsxJPEF@UC8|yp#4NimucS>RC-tJ*q>;GL`>S+(dNd@J+BYNI)pt09cwML+!$^U!)q_}ic*3G1!eR> zjVB`l37o{97jM7M9%wA#X9t{_=B70%TIbo=nOs*h--v9fyby7=1MeBPB0HDAoXIu5 zf^}dCesb^6BLt>ZDHEEK96pm|TuoD=sq9sTIJ1TDO0AW5MsPEJRC|stu3sJ?L&Rdo3#+&R zhzbY3eO_@6@G#V(qR8^6bbW2EHW^-IaW_ONSYOJ9%fPPI7%?cDDCbdX-JyD)oMlfM zOQ7lpKW>n`m>0cHV={kpeKf$Scb~T-c5pz7YUAPBx4XL}6|5JGD#%@4RPNmEqpJ6D zd!{)*?If<9nSMxP9v1^xHI~D%j`N?HLo=hk(8o~fSd)!FFI^MB1Z=_VLWa3KvuU+e zLDS%C=45v2gof$=we%!)NJX4gUbZ?oMVD<%GvB3=i(!~u(SfKW$--bF2q4KS7j-~J zr(<6h6CAvr^Nuk$vrTv6PA~CGN<@pH{8d)y8qK+41;=yv0>22=!Rol8nXDlUo110i zd1jpjlkC{=qFi)vOkXUx$SUzrSej+j|4hsYN1(LHepCnWz&v~RD>f=wbi=Xsk8+Np zP(bTn*hoU?xX0HjYmgBB7Oak}oB7+aa6U7fGN)KNkaqsDyH$kWE;{i~J#KiV^k3wD z>GmOfsQl{$xcI{D5^YN@S*z#(7+c4bp*V_>kVJigHV1pr42@{AkqWXDrIJ{1P~OGTGdQIo;|7p&xuL75P!++SrZ9$v&qoP$okj1YOW&s7W-Fjjsfm!TRJ{S?>^tyi+@+qq-S z+c##w8fmmk?j*810TD_pyzG8hVxRiZW8-x0wL%thl>P8ru?y4Vxdoy~8F#*8XdbK~ zY@hk_g57$bt2bcV=&8%>%Fbx}JS>>nI(Cf2^ArLjRCPl|$}>@Z-7>yj2!It{){SFO zZ?8z|NmJEB4$MDIncDe7tvm^6U9TD0UO+Re0)-1E!JmRYbh6;sxe0g|QvMnFv-$C^ z`L*}D;Btw7cK-ip%CP_E0xU4|2+<^U@tHt4xfz_+@+-opl+t!J&^#;70ik8rz}>+Eg= z(WS8`$*&@cYJi+i=P-#a%qWs?PdHf|a5PqMOp*r6y4JJ#7flk#sGCW2JW4U=@1};n2=+?}_*?hac#;XMPPqnbM8;CW{BtE_jHn47r#x;!bFve(4ZzO+& zT?YezP7u5$4aID{3HzZEUyed)aiG^=`m}pTie3#6JF0UK`oh@$$QGIwJB_RKWkg^g zSyh;KCH;AE#8DV(|4rPg>`*&la_N>HR>VO7@V6m}pokABrjk@{E*oDGdL{bzZasL` zIJGejE&7`Eb@k3}Ea{i9`O=q#vg3W2rtU2ae^{oU4f{^TyI$OzJy@C2esp(5bP+u6 z0vJOYi*KG9-MA?%&X(3*k}7$hx1}fQ55lumK8aJ*-X+#IZ>7Y(GhW<#xxKmP{cUBf z0T!thn3+lpQ1&KFcXhet@VO)~u4O{#2K6q4P?%~TjUvR}-M*9ZViwy!5(pf3^3-{G z>R0>PI>ytgN=e4=^lIu|j@K4XRIWC^XZb=(g_}UYbda?+(&pJwufA7TQ=8FDaVUUa z=W~HfaB1=tb`xLxk|IDI_vZ4lXx&7D$#_ZHGE9);*v%Xlu{Xh{Cy@cHbuYhltdrNp z$e5a+HNP$I@{VSNhR8HeO=;-m+n+tJ;UPb>C+9TxKXp_;>Fou!$e83E|C@5sy63kh^3{$SCzyki6zayT0zEzNRm0Y!qFaw!i_X@ z6#PAIu!+M~KhqGL-+k$1HuQt5)tC|e(7Is$D=_RATbQ+d@)Ze&izob8!nB4cWI`l~ zGA!FGW(p(9)Fe7Vpp2G3u>~)|E*R3m5clk(K=Wr^J|@{keWV+_71`~ts@QzY3{Hux zJIU-^i+{3&ctj!lE4@X6zel@2t2xCUi8P4TD5b)t*WuqyY7g1RKEKVvXooiK`3oYb zO^gVH&yNi!qnsLQ3`aG@(JI&=hVY{{t-z`*WB7s(8zK-PN?K=?qVEI)H4y*S77Q{?B+72$5%0=y<97; z#Ai zKw?xuC|_bbS6np*rvyb>bQxpLKzaM2;koGEX$jQKb<_j9HoGIWZN92F&X z{5bVdOt>HCf^0{FEK3Lp3_1}OZ=b7GWp-}%kf39G2U)rF*BLe^w^X90^8op^WJqb1 zC=<5U)a5SRNt7(ud8)J$bbqZxQC+c<|4^f{G+9S!!lxR^^lg97kS)b1?vwp`D40N> zun*3+GBIw`z_L=&XF8BJ>DCm>USKk*>Dgk?qu3wXb)&%$%PY^mA{tV%bdwGeBsaU^ zq)Uk)-SwA>QKv8j<)N0>IJ%$+go0z*-NN&CKo&QzPu|jJ6 zd%(DFj3xBze*aUw=2PBukAHyeU&tfI3a}k)S`|Yi~6Qh@{V5vo8>mgBXIl zd~UNiG&w&xRM8qtpUdhm4=h??;F*;c+$&`N8N(X6fzO_q^AdV(D~auPaBWkqAS@?2 zEbd`Iprvao>#S>ay}9!8{IxmbF`vkB3DBx;=?o$v2^B_}5byC0Pq!!PQfcBr9AhMj ztKX^JF1*VmA16KQ(-`z3$fTUoZPlYrYB5Z3308Yr!4cekMgIiV9z;K%;&mj?*PxGT z{dVPL);O!X4DQidyj3U3qsTLfJN7Q?X|XjUW~z60Oed0t7Q%=riK+Ls`<_iJTM5ew z-)u>D&u(GoRy^{)D`+U(y0|A{MM$`Kn%s(#B0QdvL+fqp20=VNva)7Z!RlVzaB10r z2$dD;Plw=WhMf!lq_uaZ7QGZl9K6qOQ38J1vE~e zZN1cHIry4+?!CA&3DaY*!S<3vjr1*vxx<``?)7<*sJiQQI0i_jPE8m$wVOU}ze@75 zF`oI>Um@_a^SU*(wG`CfEunwuIDQ~W;?th1_>Rjm zqsE{D92%b8pLKXdOOU>uPrCjYQDsU#SNd|0ohHf}904DG-c=LFmurHmxoQ@GjWLL; zYIyaebLUM(rDmDw>jpZVHf)`^KQKJY6!15xet7lCzuTOaZqj*p64W=PYXfv|>#q{j z|Ez99$&>=YrT6-DnEN=U`#virg5^)*djXm zruSf2W6!Z-;`>L^F8?r&gX;SW4HrdC!NSfa$=UHs7_cyXWg%0#<+!}BrZ~(^1|ixz z{h;hj(2a2{#nz#+oUSXvRBH400+Au2R($6N@sOz%rfMwHd{WXTW^uY~4jtmDMR|yX zVTuUGJ*)%NpQ#Ns{1MJV1ab53NgD`-03l^KZQS^wpPiM`A~$`UmP8f5HM_Gd<8M{{ zJ&lEQ@?`9H20tHPgp}`=5Oy(?$*rzMJbo}4#@1T5*-!`C=z7|xa9T#YMJEV>|yBQlap+ncNl8ZwYJl0Ir|7onbJuFs3alX6F zDC5K zc<(EIfE-29JtHMVeHSW0`3j-exeKQF);5$x)}pNhzka`cX}oyBZoX^wkXIoIuq;Ei zLRlE&%NP2p%k1Cdl<+QXqSis(0RDVGs~|S+c8GQI(}f^+FLk-KoxZ7|C0;A!E>;>7 z?s~QT2t`&JN>S<0akS{&2P?Pd6Tkju=};6oipkrb74i9U0?fZRo*MilVTrNGXk^zytYd_!~Plv6`y%x6n+}V0O9lAKrVe!P=K;guyo~} zD6Y{RKfFfyjeoFdsXk5>Mb!C;C&R%Fxvqhko_}=WP-ELf(w;k`Gn3e=9k{>y`IE0j zp+bvG^HViA8Z@Ei{u3`+rLU$mpGT5_Khc4h-fd+KXoBhfi2OIP)xIE~dl*ymb&Y>N zBzVqUbvZ1&qrA2!16SIxcNEa>41iMIdh~uf08hKv>VFFv*o-#BS8^Dbw%a|Ppnz*FkG?+qmoEU=n-%Ae;4pQ|ALtF6iZ)mD>wwXFi1kvzPA z$1Cthz(u)aR-~UJxZBI9gK&+$6=}Va5(E4T8r~;cuom8|EMr~g6=&LK{w(cH@#m-c z-dk{8ZcqQOCFn@H5dquT%nrb9!1~#s;KJOSNl?H&GsCcdby>iGec5qG9m8uR-pSur z6YY)^yop`uG^sg`bfli=xMZ1jU!u0d|V`WX3rOPvtq=UcU8PpLKLjy~w+?YJ;@3mRk}D)yRRDy@q|7%L#iHv!cl zHkp0avuz-z-|ytq8w-(XG650HfkwI90XOQABYKoo-fpYtg^?p7tvvrT{qhP-U>P5O zG-{5UP5K+8=ivYfNsa0J%@vaj;90)Qr}w}Ictvas6Cf9(m5+T zfz->-B0hD^pyp`~Luc>Zn_g*dT~tOYVU(w&qO3hed=#6jr(I8QPp*!6X2G}_rdYO9 zqWUT#e^&bgemfu0zn^q%^3(Kp;5RIq9XQ;3=wK42{d|1YtOSMmOY*Wl>_{2+T8JoK zC0cx4wR)XYp9jK074)y&HC0-R8%`TN=()?`*s#~~-g!zx9KsWO1*~q=A&XqSC|WUsE?YMGp1XW1+cRnhV}oIO#Uort!&?i#i;@f8 z+_Z&LqxjZcV^@!l0Dvcse``w^w+XDF+WgCl0YMBp1S9Q)RCE@jfpz15NL&i4>5de=(Pp zNw^O?12E!lX;cnN;aXS(xnP1kotr*2pFaQ!+1b>#5d?h}{QWHsulPiRhKo4rH5jSn z6_C@7FZjMr>+3W*ci6i)0Ol?z53=K9zKCsO7-Iw|)%%AdlB2-ve|d5hNdB=yA17XNXHjezAsI!c;&z-bqE35bTLv^i*M?%3ad#PFD9(^7@{9=sDVgb zjv8BsX_X?8kip_*2DCKro_@C0hPJ(FW78h327O#Lji+Jap?zi-5R*%DAxtS^TT&(3 zlx)d$RnW@8=wgKN1srh;Q?eW#0m7GM#N^2cRA?G>sYB{$0|&(%P=O*axd+hb?TC`n zGfLdy0eiGI!uvZ@X4O@ZR9gvd?)7>L3w=_xbil!S{*JE7N7PDHcJ-(&dK~OM4PFxX zCZQy)h7D^9X9r4bNYBgADe!k&`#K=n>eV`qs5)zIV&GSWgU7kUr(}tfY!;6jk!o{H49QmQr{eJN(u22D*hrh3^zq@L6 z>inPw@QPL~=6rV8xj^M=W%T&?B9P#)zu38OV~!ENiWu)*KQS@t-Cbf*HbxV` z2gbDwL2;elA(a_{^Ou6!FA9~z#OOTk90k|2T75gt9=rGJi{7NyQN8=wI9ZzlR)F2- z(9n{^NX&hAV^n@Nv&ajVGj#l^BGU)3nE0A>U4UXjFQGBVwW;~=u8K`}Gd z1Y%}UhWv2KEEUqt#m?`II(-oF@DlRe(OGPVCx?je3Sw1Ih-m8BUu-bKctbTeFQi@f zp7m0xP&X|wJ-rWi@uT|V(@&H#0%;Ad>Izh7nQ9x!Y1i4J;plMa@=T}zWU70&C77I% zWgI31JcLmUQv{nD`~iJwq6Vf^fQbXtv=f^uTm`c5Uv6x{5Y$yEHqgp--Sf5cnZX{; z@2f5SV|V^+lY`?kfIW&w<}Z*R$n_wrxv`n4wnKlNn)+Mnb#S5~*{j$4Xe-!8ZFtrL z9wq(1xbS#eufgf8hQ8qshDjWQd5&=|^2G-)CxFr~j?X@%MKKQK$M%;8?c% zrb93it1HrMpDXzgh(l1&K>qQiogS(OC0k|{=<~EL+%Ia4AtdyS+I&6jU2WYKE0*0x zw=KRj+}cXqBxUY9P;))}$&e|Y!Da5#Q8XlP34d6(MS1=ojRg>t7(#gQGpe-kjjXhNL1_;uuzI3Vpy(`BeW z^4<~S1Zt7FqZ=9-3nra6Kv@Pu=H8|a>#ET%CSFv48E6l3@v|ZZmS_I3LWshc$kf5Q zwi49;3gwDzB}odbAlfg1;SWZr)#C?AnNRMtJhrM>e)ziupPa^+ENFL=58-&e zz(c=vEnXI&V$OwW@6LxiPB|pmWkGdU9WQIhrDi3_s@$|H`@#TwaqDsz#V;M++9=Q0 z!lUYA9+JNYv>3^V!tUT1IkvVEqr zc9xAz9Z+;zxRfp0Q;3N>9Ph$4^3!@`?EPJng~`9-Yk08-JYPNnO7z$K*k$~A*`MwQ zE5Ff_r0Kl8;EX4mW0$WTiaImuTK{!A+{rH9U8WENkHJO(Zn;&Y${=<+F?GA!uei&n zp64lIpT7ddR($WDuS#OLZPt?SLP!wHtl66@PNOfQ0uqCFOBzTlea+pQaktoptg*Fv+BN%iJ?1oh7>AFH`6ylgbYo~sl?0e3LEOtqm8%W9|!`q%2 z=#nK1vduwlkB_1>IZmpPU##I9V4@AJ%T9Yuadi&^j2Fp+yRv~Zr$m7La z>?M)8!`9Rm>_mNEOfQ3Lad&ctMM5`1mMP%0aaiTDM`mD@t;{dj#M+x0nb}^BDffBU zxy1SEo+%p!WmI4S6M}Oq=m)Q_zb_S4LQ_Au*YRr8g~gm(1i$e7i&@o|JCL7Q=-*vckJkrH>B8ap~0iXKb7{oV1^iC1zIesd+ zt%j}f0LUxI5V<#O-|BwUwR)ho9b$V();+Uf{->_+h0x3P_VD0PRjfGKRV@LO16N`D zz|c0p@ZsKO3`7wCfTzQ;+Ulws^)5Z|*= zYOf4yQa-xdi{9i@N75cX^FW6jX_rnnd5py79WP%nA;ww1BC<6wGzuL~W*%852Jh)$ z6V$Ux%Ym#m_r2uU0x>EkUnW+pUGO_5JXV~OO!)-qz?RbX010!or&GC3FShg|VXB&~ z#3iK|19CK0JSJW8@Rv3@E&`-T8e&4x+$yYCYJZXD>w+@?N>kMG^$RmD%(zFCdFyRj zWeoR|t|#wrZ?;Tku}kw|^fyY(Z!N%{#a25%BLSag!XpJ4Zrm)HWynZu#D0Cg$2}8- zS(_Wm6dEyQar+#?2-8l;&vDCgdqW^NTU)_2dog8CeAYDR#r)61V|X{tph{ZRvtH{&m|00y zDOXz5zBMTbr7-8A&B&I7ka6}F)OE{3JbD66PCI|tx`YuX;RM=)*vzBXlEV38W>22P zwDgiHmYp;-kMST;?`Ck(6IlnDOOe7rl9Dkg`y`k5ltAXkuKT#y@oo{iw|lQC@h3-i z=-~3icL1(eZgW2q#eWp9MG#&`5&kPeU;tyCR@%8==}Lt9`{I`NeNY+!2pJTC!HnMT z>)i(4{|^ij{G>qjq3!K$iubuy8_a9T*Yjj+(#|RznMpwVzqODOm-0K9?f5F0F78ip z$GL+tuGSj}_AX((SKm}>1-;k3OTqSbskxXRsn!)}5a6;K@;~*ut`rC2;{})Ke;1C| zLFlK>`U^p%>5lqRUxT240TP=^L5<|M*;X(CZUF4!45zGWp8I(NmGNpcpOaq^OW-z! zvwsn?>J<9)tO&!9n8;VU{CumD>+Psiw-{Rl!bY|#9Bx%xUcSnGYEc5*_{eFrb#F;g zUp=Y1lW)oQELs0OHJdpV`t$pCw>pDgq>AMhdKjwLy~C4n{>oINrVwG+EPcH-;Rq!= ziSNVNr@EEbl7^razniU7OOpnS!IL_^*z#mBbY*>km;2=kVX9a2HAu_ttx%r^E+_JR zPyYgBAUbmf*omd2m44R1o7ee)S|UL-JA;Kn-?~mIkyuE-*|wEKt(=HDk0+I+%ndDr zgJL@w3}42rGcwv)jM$4D@=Y|(l09nhu*UfCM6B&E_GRdk*N@~dn`i;dj~p&@nKQT? z%al&7deZ8~c|-_d?sGruS{P~QMo%~*35nSNy`~#;RVo?dZ=r%ZZzf z@Fl#*ZY?>Q&sU;-6eog*r|;H(S&EZxP$Xf<9ODxo*tX4*d{7Fm5fkA~zRkZ6GBl*s z;%VrTsghXo;|)0RDiXVBgQ}~X1nSf$i%iJPVe{G!QmzN zR{7rB1czp>HZCR>Mx0uVF^IqVmb;A~rd}*JX5|))#s_M-lGAg~A4vqs&=mRF&!_u+ z??TnvJy>`uKS+jSLL(X5m~`TXub!p1UH6uubTqD_P!vX@C1`wv#-k-DgZn8dS@_($ z(#eMRi-0RrKJV_><+A>B>XHudv74I9@69w*t7}QD(**nK?De`gQ?QL`Zip3q_p0i_ zqYb_=tW(*{n&8&N;4g5g2$QH~XBMh9|0iiuI>Hn3@H{y}X-ceEP4;5yJ_BWm`HLniuOO+r{pz?p z^GI5yKPF3A-j@TdD=VwB&FUg__OBN3Gt--LD)$E7+4{>aT6laB-n!k*eB$T!h9(J+#7S z<^b<6UJNK_OUt{^AZx6vtUNKoQ}nb5()92%wG9tPDW(yWup zjr=q%r;z2Cq)vbjvmA;wgZp?HnuNg6r|E#n)cm+bRejDjahxBII1?_FqpCI2GW6Ou zp0Abg6t&cwh@7q#Zn}A~KdknX)qNhes34@{j$?60I#0ZIcKMU~45@FeG^lXKx0oSL{8W;DD#9IyMaLN@68^Gei(<(CcUm5aeWZyz{s#ZS{ zTF}X5p&mjCC#8(fEn_s1#tp9*C}P>!*QZfA;~D`n7}1O@T(Z~DfAQpvZA8nrOMEi_ z-WwN&OO^ateedYgAH{)bJd9qN@a{dSUKR$lXsR-Rg$hv7*xlim8b25crWAZc#GTYA zY>*|z9wIivy2xh^b#XNb9`|3hI<^Nnht_YIt~r0GmzK|ec_**`&z(~X0~=xs=KaUO zS{}*eM|%c(`=HvLw*RZ~(ep&dvVQwVE8%-r_x#iGi_>eW%?%AMzSldlTkx~MDx&D< z_jT-;t64{~*C+s7_Z}k={!=6Ad0w8M)2J^FCmj7#9lcADz`QgM;LF(ftLQsvwAlr$ zLQ3vvvXN?!4OxdjxYH#A>uq$wRQKgKWZuEW|2=bNt^st9gLkY!yCnW1ewXkaQARKK zd~@Z#1n@WN$7>=&?*qmIYh9hGZJC9(doW{ZTX0=%?3|mC@LC4O#O`2d_dq#cdZeff zQDS6VB)`W54t>2h#0KC3rQkxh*IQzA9R9 z@P%cicHf!$^sC&ff0_M&LJzn$^>=t_GMe2Q&pg|cQAG?F-8%l}&FmvTPx;H1LtB#$ z3~IMv7ss)vy|pmsiX92CrCim^t;cxC#eV;huvj>}T`I=rRmu8X4pZ-H5xik6# z1P<#H8`pECZ7Ewzb?qY1^50dNkPhnizhO9hn}@9Rc{j{e-&|$mYr^z1Mmcbl=q1%- zArZr262KJMlVROh%GdF_jkOZ}urAVR`P1_K zb>vgD#pW%Dy5nt?S}pehY*k}J-Vb^zsG&NMTJL1`zq4d%*mpm^&b}>l0-d^i?(*h=t&lA8zYSqcs^N!3Vd0_X#jrpa`I1GTNebc^uqf0Tbw|f_DnaE(mndG zrwHYo3w2bbj*_m2!`=-NQl!=4)(z=nrs3$*Qg0jJBjeXfSsiVi_9q7yLZ-B|-w)4w zohSDvXM(Mc{uUYI+s~Ko$#5dp`S=PHDg-;c+zG3~A7cddmh&nF?yX!b4WUOHE)Hakebmbm z{GWT<)}(Ek6t&ijT+0PJODBul#Nj2yavcq5_C}ujs0c$zYZm#}E;%!X&;}ED5#y=@ zwl`TR(G`#)P^)@Ab332RB8}!al7paA)60p! z!1d%a;wKLlT$+5bhGLWCulk8zY=eQYEF0%%^64ti-7B(SNz6It!sKk>vWDkm4%-ex z8jl3%d1+(wNrK^wC@MylLTz5%05?0ft$Ee&chlF843fZdV#X1Mu3|6zkLDLWTfJW= zCaB6^6mz$vu@!pIWP^CZYZhOavQ~O+DQDb;ipF13VfquiJ z#JvqR;ULLUfwr5COPm;ix6=K+8qb!|fEErV`!BpY2 z86InA3iD^T3|LE|>leG;&Yb}EXd7ow%`Kt;OVsk6&A95EpE@N+Kxtp}mLMQvYln1PFK zif%L}%C!?~fH^L1%2euajXn7S#Z+-6N+ZG6=)&z+Y%7Y>3+3`AQ3P`t5#f zEk9bOMPWciPz+Q?RHb#i=+0cCq)N?k{lTO#q%G%+)3#URg>4KJSmPhNm zyxG!|8Nn%W!H(82W!EC=T9`o>K7)@Q-wY!}$|%9|-YRjxM*avBjDj=GOESd%#VeYWs{*uwzadV?!`yV-gIKBT zjI+LL)ztOVbJqgZyp2mRP6}HKvp^eJLGf&*?JM1?jr0z+TDX&flYx_W6csf~zP~c? zIo7GV)K(UjpuqzMRu}R^bs0^Ez1)J!R7O!9#%#ArF&ve8?~bO@G?+_GuGF=`hP#}EG?5#NzlZ@Tn zkA9Qys(LJG0o>fv)4$D9)?NFbNM%<68ZDs+`kbWpw@h$@@- z$23~@Np&G`OezwWSCeVjH==S|=OI3I1yxKVReq8SqK9V7EMRs)to3{B{djNERqu;^ zvn}sT3fUM>I@xZK=&ML=0jq+*gkXW}g5}e0kpAgT^+}6ESad_+8qCix50RapfhIM3#$5pVHp?E@2lqkFm(0!#tRD^ zOLM07F3M5|$2own%%lV0CZ|mw-0M)k5BdB5b7!v6TdUc|$9~skwd{aHYrvh6T8XQH zp7-QHThV8I6=VBPMNr@Yf7DYKOlXBX2yjFr6p(l$=?{AY*?OSuwaxvLS6?-^?@9N( zl?@vUCL|di)%|ySp1&~zioJG3Prj{hgWmQRX_{Z&?5KrIj^8e{>Xn=Mi`9p;aoj$7 zFHZPK{KA&L5%tn_LB9bar^B`C$-jixJ;OqbM8?C z1o_RPIo|_s%h?)99Ix3w=0^_}`?4`~;omsDG~|D0iiEa_oIGn~%;+V4I?P?Q=j)o+ zY8vpP{aD{W>!Kc_#^~&U&qG7qh3#V8@tc3icNQ=mU5D~f=wb|8=V7cK1Ez5L;acJ8 z_K!_2>N36FJ$r{l;olB5y?Fx9%dn^Cq61&YSese*n7FrP=?{(xYz?<;{ek)}yHH?* z#)aL_;;8`dUUM#NXS9mxG^E9}UhXKynEO?~mM(KHF_AT`p|hIwXsgte{=hUmrULSh zg~bWsf%sm1^Ib4WG2CC(zTOWg{BeZPhu?BPLnh&HYLU*IH=`-^ITT|#VFyh#fWgA7 zc+a2;!Frk^{gq5&v{n@S>xiZ2VeilVMFo$4oj?qk}Ke)CaadwD`5K;$09W-| zFUm=X{)H&ZTb5+Tx>c3hS(BS|`$V+&@{JeA&C{l@TdO{Kl`%>HN04{ z#w1raJg;+rO!?$3hX%X{4E?`d(z3q)N}e)wK)M^E-N2quV>(*xLq~xZxaTEQFm)YD zVgv0LC^JfIhxaEQ7_3_ubA^bY+R_E6NezeSChDB@+PNUeRhN98)oIiWqkXtn87MQ_ z+Vvu^w5^Jb`Ydu9q_mQQ#={R3o4|6kPW16&I$vR^Zq4&H66K6&wiDSS~T@w;^}`WS8IlmT(Qv|~VX;C=1#e1yYwwswZ6+2_U&=Vf7T z{{-3IJ2`2@$<7<|DbCy%Bed?fc-Y-NKQXOb_M99tB9-r4FOm`G&O#?D1wJnkZt~~O zvN63TpQqawp!xQ(+Q;y|#N;n=`Av0gPJ4Mty7-x^);o53ZLW8x6j0Fu9BhrXh$V^B zMNxI%XkArckrfyMlyQmDnSZ)c()s&1ke@i)k1^)4#Rd1)T~sZu{<606xJDt-d%K=y z{u(fG^?Kp5kbakbK=?3ehmR~8KN+UPnxA9nJBjLK+LUlJ&P=M8K=BgvWuK($!cJs_ z(zx;hQZK_hWP?W5bN=efRSZR*|)2iZ7$ z4GSZyLl3UHy5_B`=B{(%x=)@E_m89oCT{@w> z$W12ET)gU1*0gjSng}}qzT=XbE`Q{tQCjMvd>pKh07D_>$@9JBrw6J(>pLT0E5bJkboV$(hB2OI%*a6lW`J1&jx>q-oJiMhs}!F zo*u`ivwSbRzhb1!+~f^SO_BIrh}XTZ4-;YBINpL{+MDOObR)Fdn|+iiRb%)`9(S&^ z1v0J8D&MY-$GM?qG6kEPKXkX!h@Y-D29Z~Pg`eBvY(lH?y}y_(LFwm*o-E8(9m2tvWH+;a%|UdTtp~dR#D6joh`NShw2>mr%rC-L@^>^JTv+{Kt6RY z;VL!BP)af813%OT*iGrGBnOy)#a5X4Lv^w2zzH~<8;-S3hairY>g2tK2mHpUvwRsN z!i+|}!k_2jl!N|C7<|JWb)%G4+a_#&DNhFn4?y^HgZHVf*4@}w#(rX?J8rVb+ZE5S zHjN_q{+4QmikxI-eC)B}*ZjNkU14k;i0bxf9cab`yXU&!a!{9esEU~q2$bZ7g)3Uy z4DPPz^+&bLtlQua@O)f3zH=jjxEgN<1`q*?`CjAO*ayyaifjZgn~Mrw4BF?ho(YUQ za0NZSPW{RMiagvqppQ{;TrvAD4d81n2j}&@_}6x*`66i9tyqJE!4WN76~}?pqa~}F z?;Ny`74Nr@(Ql^{&7KxP|CT*tg!f7n{BTeb!(-%$@2!*hzt(B*UBdU$`w1KXn0E&j zy2JHNyf}GQXn?b*Jd%Hd4G{NJSo3`~>5MI;o+o{mXQUXRCs z&rclIwZQ`SSj+F~yj39oeM<-5{rKAh$g`mN*!gFp8$TTc=5VwA&ZaNv{ z!~f~rznGbyy=}8cIZyQSUjLsPKo`j0I`1u;P3Zd&nrkV>$LjLr0XB7#$W{DU-QFzh zhnixI^7_?N>uwIrz=8Vhjn2oRrBD#Vmf9_gZ4;1z9Dj;Z5kqXk*1vdS$Ortm$g9n= zy=y<_Yy$0YK$C9UM-FC0k$jtUp%(3rAY2d;AY?vDG^vL;3FHlMmT%C6v<2sT{s`QO ziu%d?OGAV4r%^^)*W`Y~**)Q_JjsacPz4hb;r^vc&+W{D$PfYVP+rIVj+Q`@j{vv7 z$>mA@hYxSp(qh6Y9#$z?zielhh5QuBXdvo;TmcD9h4zt~ zQNYvs7UA_kg{ZOqHZTk9WLT!*xOm`Tfo-)G#wnjM=*JbK8yWR}LSc^g`Jodlts%P4ckMes>P$c64zv4DtZ|-}AZ`?-p zyOWF)?_Rz@9%sZvNGY94ipCHlK0h`j2T+?sQ&|tz2k-511zBy{`}yzg-AHm4??jHD z>9ss0R9C$o2s6V6Jigd7gLhCW%!w=QuLrj;a1@cZv%7rmUS_d?TrRu2hf-iMP%m-h zD9*`V&!3+sQVCUYzTIoUkRD}A7$W-PlBs=pXxpGUm)&~nYD>GY-U+D9vmrF1@N3iE z$!k#D1rSKDo*6A?XE!>!*8ZwUr?}eWv_F|!NC^Lu8&h6Zwkdfkh+VaS@`yvQ`N1t+ z^`e=0_q#A%#*1Dnny$=9Bca3lu)=NSNdhfT>k9A3 z+&hoU^B8}d-QoTvjooe({I`prl(Cd`7*=<2KMmVxCV)3|UQK-dia1Z_5M1#WV^q^2ZO!+IM z&V4}yJ#NZUf_)eCsX*3tQH-5nlY2{lnW`NIt_%U?^EH&AZ)$IB{ANli^Zosy4ihS) zhi|%rn+|jKL@?wX@H6D(;cL~Z7**-cfy$g3)gm8v|9Z&TzzqdP$%b?XJFn?{(L86d z0x=S(@<2N>lA9qp3Ysgx*cY;eK<;P04U?pm`Y{6`FM!Ip%h0GjP1>NC$0t2SG8;C` z+ImpPTO*5s`DdHu)^n>^4lwP<-~?=(N1+i{dHJRRKv@j;w-`pa#n0Z#`d_Z!8o9~+Tg_=m6w1ddT%mWA(HS7V}Ay+)smW9BHl*r{&v;%nh88rci5iTr7@SA^+?CaL|F1n&6nqWoFQSY-l z@WaUP$eQ0{;`?DV@iZAY|Li0rGgTt^B@nxj6V687TcM&j`0K~FV2vfQ?g_SR7UQK! zkVii>&TY-Z54|$fVk0x%1tKk?^gZVpiwF|}VQ$&b4H*qi?J71l0hY?Yq?Phc#gjnR zdvaOk9n?5nZjTkQEh=Ihe$!e+x<>uZ1TdHgpPK=TXj|z5i9u(`2D|cL836F9SLyn@ zx59+zL}APo6p98Nt%{KE&j(z2nmu!?&@Fkn>nQQR$CFYKe7!oIEddQkCNH&QzCLW6 zy;{F;y{+6&QyaM7MaGOHK=1(Oz+83=2;_&FC*^Z!QVSkz?iIsp8vk93>Rn5^Yx^Azu!xhjrTP={?XI zlvr7t*05{<5puGndSNDIY{BCv{DTFh@I)yzb6p9}{VL$7Zo3#cTc{d=l0H}`Y+t){ ziH^*%Q|M>;jNs7KOYPq`4im<;9OPu7V>;(BQ%nkLB-a+~vtnL?#AQ@VfTPy_`7ntU zuafux_hW`p4@7>$lDPBlyoU|k3mWJH(_!K=n>5_M$={}BKfh3g>RNwm@-;X;nm%;y zlA1bFs>5_!|*4FTTSh1|DkD3B$ojs%337tM3++kYtR6n4kzdNZ$-O!n$yAE+C4H@Nd$cUJ^A=+?J;FZ z-bY?Ac(PgScnrGnU{EO+jPxFN=UZs4np(4tQ$OMS8h-Rp-c2$-7d`I&F~6^!LYJ0H zdkt!#J))r))RJQwOQV8vbpz13$(rEi5yY3l+UgCeS$zzc#b9RFdN>kpUV%y#o*)@C zaf|V(`m4EqE1xhnp!v#0>OVKG#xi@_?H)UZHIl7kdB&Zv1me9W!X)VLl|Z13e^|Xf zo$M7QVoRjrP9{I_*Im!xA$Jt4kYw$z07qYBSwfg-7R3f#V=V90o z>GoQ|aaYHb;h5Ic@@EX|pr;Evp)I8lgJ=0`WW%=%(F_CXm+FDu4gDmhwm9m{BCS)8 zn%ecWFZC{Q1$`aN=Vu)0{oJG9)#W?I736PkO|7V@YBKtikD`*KOk)b2Zr9u7c8kGM z{)|E+c-6yI(QqYuxa6x@Xqh6vY8v>Te{G7`Xy8X!h_4@pRhAEm?BhAg#51Z-#nBSKO{i(Z2f*ZTgX@|koK+^uZ z2KmO=!f$-6EFK6tavYte$W<+zESCOs&4ZnKqWPr@Rsr;Z#Eleln+_D`5kfy{WrMas z6QGjo*e5hfkX~f5OS8j1JquLY*7(ED{r6M0Y(JW1POxvwGV@IHmtZ;t%VbN?q)J?u zdhpeg34YglslYnF?jX_Obo6YgqMCl26<6#~fMK(8~%!bn*J;V!p_1JL&qTXEllg>9T^{kgq(VZ#BPde-M4BrrxPLV2O1>iv|YSBbCxVwfkXC=L8KW2 z33+Q0PeZLR?>Df)@P>Ai`lHY?IqRqIn6kfr7}QTZ_KoZV8D`uZtypB+8$Cg5I}mJ{ zh*n0u!wqI$_UjOL6SD#{5I~tpnQ#Vj7GfW>`=y)0;?-_*nZN#Tv(z2WtNXu*{0II_ zgqRui@dN%)`xx54V8z16=dcg|`rpA9Hr4pz5KT%YeJS8yN#Sp zxO148ZV@*hB!Rxj&nxd-fc4u&NsQk`x(q{c3Dx?sr#EiB)WVE%7n|j#dC))A zD+<&_2nWan?A&AYW{bzqVM`3R4Z7gVCrxqKv5$-O876HI-s7kJfK-1qAqdtF+D^e7 zdS;VnzzkHLpfP1jT*@3_HWZ(BXz#XsJDM{npA0PP3M#(M8#JuZYk65YaSz#oGZ^#u z(?~m|=rDkU8*Sp$_pJ^M_j5eGg8eX3_RI%Mwg*sU0s!A zWpx2kfSSaFX>ln=>=2$7#F1h~LOzM4aj@bsAzZ(pr)y|W?hn}G{=zuc_qD+-Mf>J=jc$h;sa=>1qqpl{b;wCUJC*@K8pa z`a#+7cs?9JCih@SjU+_z9Zihj>~Pn7v(V01DOY5ExdgjbgDWTmnRAOnjf#e?!2W{n(IZISQX z(%kKVn&ML%vPglXdEcTW+zBhL3)vQJo0ayY$~xhextFNqMgC6FQc|5$;zvnt91voM zMo^#?pIokOZovy^(+H+64RGkgYOrI%4<{Zd)g=kh25nvrdmzV) z%THSLp=yaV4?EZSjwv@Z`-Fzsg+CfW8czGIW#w-EWRRq%WJPp4hrw%7`Ex?@z}B^kcsr6ii{`Ty>br7R zzXY7L1h#7`HBbxYHVEXmVMSQ{Z~vm_8Six@{g2|1{BOxb-V{PJ6Cd)vWBMO8FA)(q z=vWv`ZCE`T@ngP8`wDH<c=6~hx z|3E0Y_|mZMcbzWiYZU&e+{bZy64T3H|9Z?ja}|$bOfKg6mU(`4@z*$=Vrci^w;hEu zUq5GfIC!5+7j`}7LS;_ia7MAY!1GSY-6^tei<@r!c*Y8rzgNv}gMU*2*7voRwYyVq z^?UrqOu@#8&62p~$PVAL;jhJqYZ)*k>m(7XktH?Cry|Ih3w#{_0Xmf1o97GWOj;db zI;TNGd%Z#Jg!^8)$m;=BLt6rt^(&v>OpAbBq`!1kw%eMT-uXW-6sZpGk z|3Sd_gGtix$ane5{_o#jcFii^XUOrx%K=?N@7F!BD3^nUH#dP6>N?NgJ#Vr}tZA^` z*GI`0dS_qJKWTfvvoRBl-7(6`y}S{_%&;q4_-3Yd@v?+;2VzRRe}3FjO9OCHSHkdA z8!+Y%SHqhXVou26wc9OdJ&oW==fcgK8I3Y+e4*uyXT6@qFIlg*pSgu9{_N+0?>Ipq zT>v-HB#E+9Qio=qGEr%~Om2)Q0N9_ zjN4`kkvOx5ksDxKht7_|6vpu|w=;HyGm5REO7ncOe=W>>)sJwp*3dwi_xW(qVO#aC zjoerLb7N-_%7fYv`ror>uCs7DR}xVx?*NF>xO(Zo>OKu%+^qHl<8`RB4+Ba$THP zN91SV4!YRUKX|>dwr6}q+8rysV=fkOl&C_bH|Xz7+7 zD{_3f&2EKxAu*U-L}7EJQm1y9wHA&MPvZ`i9v;j6DvT3ue_wP0D(ox@yBn`+?}Ta) z)d%RS zX)Pz)U+Pboz94gY>Z8$U{~?!fA_UY~AdodTRb=E%x3+LLbGDmCfxnX$U9 z;b{t$n+xYjr_r_;<4vPZ{+Z(0%!W5dxkT2OS`!iX^om*^Azgk_6#CO6`Qq+)(Lxw1 zld{G$xM)E+WUut-Nn!6vx5Go0`N#-AX%Gt+dvI3c*}~h>qt@Ceam?&Hmv`!TXMk9m zvS`$=A35=jTkahxT0%K)*tCg~jV<-E+t)SDR@XWG`;IUWcqomv6!V2h(l2J2+-VwG zn)z0=(oRlJlu)Sy>+x3m>S_)m2>yY+M$LfJ z{Y6b~4-=)jSPsc0IFX_UHm^2K!v(on{YgEHy4ZsMP@^cCay!U!=idj7pJie9&z)`` zGPk@wMmUWg^?6?$9*^zH+@xi!Wf@Xi;z12<-OP{jr{g`|aBJI_BnPzab}3?wwaUEA zIM7Sh0)?NxZCL$T438~A&uAV+AXco%+8h28`v~)Ue&O#W8W3Mc%(cOF1AkT6FwA!C zM>N!a&2DFIYo-Ys7ZbZP6RW^xn$G>@1gd>{7z{GuEC1Fu17{df;po7V+u3eJ#z995 zz{^W4E@a%PH#sUGr-$KPW;Hu1Kvu9W?ZFh~U58m=7^*%@qY?t(d(hsU(3c!lcw)c; zC86T9Ns%HaBQGObZjS6CorMi1;G+R?G%fWN?+{wlRLGJ_0nic+b(8vqvR(^FHq(U!vhTaV5~KyHxA5me#;%swyvq z#_%sMDa?hO&nL1qky4I22N9F4q_`Y$D zU=8dw2M^0^2GOqsGV`w>v`{)dpuZ!@0NSCU15C*@ z=FiPSsBh>cn9lGPmJKm*=*+cB>}o)9Y3vvlH7IEI;*p$4qVKGTfrxovY`=RTk8+Y6 zsM5J9$?=Vc0j7WcaNiymcdbO89euvR?5=SAh0;H~W&<7NdYgfs zd%O+T?ibQ#zra9TC;cbNx2i)@K*iV_mg|tP1`$vu=f3w3v{v&r{or3_} z$ibtdqpPc{>1jp${{|$}Z@P6q((7ER>NZKnRJ%G@L=s%Cx`=LSeCPZvNc4Ff$&uu~ zI@}$vAKh6eb+QBm1USFZvzlXH20zXa{69wwGsHQ*fq*BN@f$TjtxAAv;#_P5Y5bnK zSJPl<#WchF6IgG4D^A$RB4Y5r3eTRl*s0)n+l6hs8y=jXAuK}$0%#0iAi(@zzxcMu zUi(baW6w-t=$>j;-Mgd{fBQV+A??eY{+ja0wjslHARD%ke9;8dg6#}9YK;SF?Oay@ zB6ZG8>CZa9oVGPQ<B)BgGHcNT;fYuiQzBe)UG|*GLaIe>u^FHx6 zZ4-~4H+u-x4qXo`H~%bT2}dWIIB|vB1gCg=i8z z0eT?x>*Z%Ej(&aGS(eQAbq7Onnb>LH*r58m2B=S*x$d4Fia_wIdiSJ(^T=Ag5ONq- z%G9O&eve#D?G0&A(q$lGf3rfmr*kF&BsnKi>(a zQZ_-3z7CWQ+9uMz8{V-GHiXBV?M5#fI!HekVbkSBi;1CQakoC*6utS;_10C@!*dpI z^w~AQwhbn<-vGYGL0dkF>)w3?Tk3q})zh3dMdD%wJV}sP+t%I2HIfH2+&se{qQr9} zT}n+3T(7w|Rtgg-W8Ew=%7QD4j!69=I9Ax6)&7A(W+H|`H-cQ*F)k_t4wE{ZR#fByrBbp6YgAg?OlXC}Ew_M_Jnxq=1kXxXFh^JlUf^7;J8 zW>zflvOcLu{KW*(G||AQAGJ3nA)p3ezUL2oe#M})&4l9YZ}I~D+1|sv>dpT>}7?px1qqi#Mt=0Y7KU#l=A0=nH<`CG>br6jnQXlkeu?yGJY1I})Yq z=M-l)a+@wFIPVigGu!aU0>{0U-d)Z{rjCE|>Y@=5F2cve(ye`sf{hTWqmgZ{b@+>0 z^W9YK75MOVOiwy-BI_Fc=1tgL8xiT0@8BY*(Wvz*tgR9G%$uEp?VLTu+Fm5vM8+Oj6|6UDz3}|DPt)b9n1i%5DQJ3`Nv?rKlqwbz zUmO#E+~4bbBneiyl>BiW>%Aq?lGV^A*iePOhUQ(p-XUkN0S=J{O57_5X6P0@ZkMiF z`9aHRZfC5JS=ojehM`AG(%hiZ=BIRk+n~^9&cDzX3T?c(hZ;(fV4Cl1yfEcAxP%*x z<1Lx~5zp7?S^y4K``tOOWm38b9GUPKYoWNh%h$58*NxSL)P+z(Rk_I)Y}UVUq~wnI z|B&+FoOCWg7DV1HqfqKnI1LRzcdb%d$s!Px>|H%O^EmfyaS+ia&?5p(oxtPIa{7<7 zh4fXiILjd-|KCS@z0)}>e%ePjOFXH%({ANFD@54-{z6H`4cCL{GB9b+ zK;7dN7;PKRdwbn!Siy4_Y+lJgslp27#^|>^rpCvVZi}N%uguMgRf!TQ+C?aVCePgZ zTgR5&gV{5aMg@{9x{|$_!zE_S9PP77yy?7$(oua#20@5&&P{Pzw5t4DPmGLpY+1#< z2Awj09cT@uQkJZla~2w8)?IA(Su}SvQviQ_QO?$^9GDGGESxj&;+2*RlR)o59yl2mS+Yc%U4WC>D|%lj$L!d5>3OPyFM z3nxzUExM#)+If%l+ojfT)o*e0Hco&jpY>l{8rPoSNeG_>X` zrU4uwMuj^Hl(f@J9sUI~7}3e{%t2*Z_KCmsm^lY<%uAe2>bcPNe~n_#K|2C_{eh=3 zWpr>(WLlh2d>SVZ*V2PH z)yc^E7xBrq*E*46JG(MN3jfMq=dXXk2i*+)tB>#gX9Gb(Lj3>iqN}z4nN0%G^sg7V zZ8q^lCs$WL&o&t|DnUk#Zw`?EE=iv~Ygef8-BrKsv&N1nGkV&ayTBE#iaQ3C(7#s# zPoe9hCeV7>BmJqNQA_rizBKCtoj|bSbqvj~DDvH#i9Cy(Mj!e=qv>Hg}yrl@1o z#``t$Z|-wFSl~may6V6N`Q?a*Rh zTm9MTHI!BD_g8$V5Imr#_q#QS6q4-d>QU%6KRbr6$V< z7>Qatr}aHK?+tumyW;fuv_y10d{FVSVgxkDyJotBSFmr*tWwoO*zjaS9K}H#+1=|3 z+-fDQyh8HVmx>||gg!F-N9cG6B}i+H zVkDldWW0xFgg)<)V1MK78-dE{LJoToNJ(^{j_d`wG48#?NAHa#rOB!ON^z$mBUj|w zw;C4{@%;%E)biQc=$9shX;MhUm+Xr*%cG1lTwR;9bg?=_8Itqq_;oK^RC%os?KZI$ zFAC4al&zUs#p;wSol|V>P$6UJ zp`@3gB&Z_xX*}fy2g5HUySE{32Vv zyqi&FokW9_?4y%d=9T&N z&7|GUprd^= ze8Be#i);!7CJ&`BuG8xfkT7`wsad(u7xGN0flccY+V8Q|+YxN6MS?bRL(=+gzQgqb z?5(_W0&Nn_zg!C=xKedS(I}~S19()gpx$&8aHRV=MDm031($}lsVHfKRtXRvSM$&0 zpV>_&G|rw{J$w5}29wwcUFgewT4l~OnX@({SP`OZ3M!pa4U@|e5W0R(#D3GDu2SjS z3~$A;XVq7;{-dTZ1yHK*m!cLIPUZ{%{pb|74>vp0!xYcSVC~^IGYIEA?MWHU? zh4e3U0Z>nNHg$3Hh2>av90fRx$?xH=T}>^#u9Ex~Hwv|6_9Ak^lHPwrK@XtYv-atc zQI%O=GB}T4a9i+zvcJC+l@}%wAbh`K_XxksWIry>Z1{9R{z$eZ8!0Z80;l5I8^9U5 zLv`8Q#Ot`;jlT&ZeVJ3RgYb@|+3>^nm`Jy+GhDc?@?P$(E6$Q{kROBE>b~5bqBU}| zJ(C-Xv6)I~Y+kNHY@Xu6 z=Xa7ih8Mxxf&PU{WCenJKfWC8dKZClG)%YM?bSxAbmaRz~~*P3XIKyev`! zZ|2Y_CF{g+{|K+xp$wr?k~kqE=|f80SQKSQM@9zz|pyPofF`uo?I!A8r<(DZ3FJuL!V?4?N! zV5~!9TLNoW70m@v@~p+hS~_9BLcd9J>SoTR(yD@u~g)~6vXNt zfeBC?`?7P9zA|uruJ?9L)rZ!s$(nC0O=E!(MejDqLQB%+<_-R1pEIHhzz=(f zgo#UjIfM#j_E`a0Dj^hYBAnY|iM0dTcBfopzjyfZ4K|K$Q#(tGOgf-;wdbBP#SWxM zBmG08mLoP32YUlO)yGg<`kI?f4nec=fnov{?>m#iEnvp-wu|z%gMh+? zIjeg7(9mSYk$Du$J!vt1e?5cchaLOT6nvG>oryYuZ!OdaTG{NH?E^RF^H7qPSW#Or zyYp4PPU{#E5ut0;L-aVW)ydPY)yXh#S$_UUJTAU`TRPVY_Yj4mFc^l%&i+n1z7uME z{^B_@!#PQnzAe6R1juGV@IwSs191O`FSCc{wA6y^w{S(1%lK_Hy}%Jxm*?GjK$U8m z#^08f)p-GUxYJWSALekS7Go3wTNB5|yPpS%xS5%x5pSajf^CChp9sXE!p+3ez^1Cw zJgNXm*OSt%2V@m@Qc+YsIfkR?_CcbH8LQw*u>dmajQ^28%PN$v_}1d4XoNV~99`4b z>Rjn)7M~TF_#_*rVOnEYYvR(9Lbb~=2rclO7toXq2hqvmgzFxrSiVq=+O0%Rmvm^N z#^8j!)+yLnJlWaN#me0@phWfA)Om&D;7D&_`FU^Nq_rkwB|pMe%lZqg#bEJtk-Mk$ z&(CURs5FTj)y=b&!KwaTRDmj`Oyg12N-l=nR<;i6g$WAwYZo8`En}_qGvAKE)09kI zarg%2LQfkc;<*(}O!Z6NOpQTbhw2d8Mtk~78)kI4Omy)t*1ZVuJoP=!zy!~*!P10q ztrzwAs<9{7%U(cnyLnKo4t274m0jg`RjEo#U(fg|mTI}EoWOGnVoshmYW9O2yR&?` z{vcVk=p$|TSuY&>rYs(d$MLuYf4VN2p;!$zvy1D;Lkw&ED*kd6fCqQWi1IOJ(gLhb zq;R1)I14gaO?^JR7lwKn(!{*T@Zv1X5XVrrX&eoqQBqM7CG*_i0<|2qI<6OC6WvTj z$$TPq*q9aecRv^b*7K2 zg=dJhah%$s1cqPTuvoQ!Yl4Dh8a|$l_7*2%S(U#_+DJn^qjX$*(!oOW6-k&_GjH?Q zlsJ}lD55_wxl}<7uxLr|w{LT-Ts9>sQ`cR>{(|^&4>HXdFP~)= z1y%kp1ZbE-pYWZ}BVJYu5peWWzhHm*Os>EeRv@*>@70w$mIPj^RkaXm9-j3XrYiZh zA(W*+f;^KCoB`pEh>>W^CCE8K4{eF8qXL5+L&j~OCug3@7&N&q%59#e2uD48LGDLr zDMr-#S7LSN4)l6Z(0X%O^b4=k6%=Xkh2dK|e5sWp5#nJwTxz`Up0s7+{u&dg6TcvJ zk5AtyDY?Exg`@WYjq1G7q?3iiz(U#61ip%s-^@#NWtHQJDkZ8sp*@N-u6d89R1!d@ zU+F-^lrMnSR&XRC_eTKDwB>rQbn59q+@S)g3`1}fN7q92c@9wh_as?1tpsxFvx)H* zWeD3`G{%1=mxIE$73sh`GVso!jr@I+zLTu2mpnNRHKTd$CdLuz4g3U7b{p3%Ll{9 z^96}(!6?u2kZ%%=9mMd_Cj%gK7$SIk~9ZoSd9@O~`Y9g%1_5b+@hG)t}120(g0O zoezx1S|no{u2KJi)|29^B%wm@VN>Sb1DPM z0Xu^$K1W*R^PGn9ln2}b%!&+3N=1eO^^?*sAm(H9T9yU(&d0p}3-A{KkqkC*nN9EQ zcF+2ar~*#!KR7CBA7{iJApe2KF&E>=&5~ADA92KQHn9i)yU*9)zt}zGg2hN+`(o!- zI$dSWelW)iZC#3#`=!6A%|N|$&6zkKNF65f|$12gA1d6^=e2CloK(bRu&FW-Kp<`&A?kjjLtbfF9^eNvsrVhEt}QM z(3USi_c}cUQ=@YeR+S0!D7a7ZO}tbfY1Q6Q?uH*1_0K?^t5BLmiN(=rZ!nV^vix(A zF=!-7k$}Bd5C2->>x%BrdPO9E@&wRbpz%2Ijyv51M5vX+0;G0csuxRc;!^Y5-aH|Y*v((T#q#+K zqpirO)|bc@FvrVuEtL7$^imO~P7p~K+HfID?x*C3MGW#&;7`$i6REN}&(qah-0nR_ z(#Nkr>oy~@($v|&0Ck21EKcH9Kusqp;8OZuJ##a~T@sb*h=0ux9+&;Q(K5;r7+$^W zk(ehTk*X;s<(>OjzU6}nnJ?7M#7&x5y%9>m5;b0#sT#hdKHMb%!G(@OB5DnvsQ+=k zy5-hdSGr5nm<+C%Oc(3z!P-M6PrWs~=C5&fhablu8i%FhMZ1sCnpwJA4%rnJw^j(K z;X(*Y=rP+4)RLzk{my8DM^GKFDk?hx+`fb?H_T7-3t2u5Q53ewl ziH$ywEn&2^u6(FmGJ8&ff94{=_#+SRtsJ(zN+p0xGC~}Mt3rzzLr0_&fAbFX{qMZ& zYeZS9IcfTs3NMH1&PN$eyUsxR6Gpm>s&adJpZ>iq2;Q7y&oj$E-RGm8N1y)~KP9W< z$wEm#sus9H*!A%AMfSS@44r(#`+I<^A`yk@>FaSO4f6ATl4}gOaVH0l*|*_HlOm^Nl6&xEJ#|Li z*B&J`5jU)3_yrh>kUWc@DSLBOx;SW}$`u?_f#HPZz)L`^Cep}1rhW?wTp@F^P&qyz z+{k|(Pthd{rY~SVM2M$w{5eU7>yi=42c=A#qOY~D<#WJsD8j_V!PE#eiMI?4L(F4~ zkCl=vhrm(o))zIHCm4U^o%t3ead;R-UdMpG1QHtN+v*1)dTt1w5oig{Jn<%~T{yNg zYgQ-m$R@u?dvpdeHkTumlxDBuX%t@7c(t&#k({dYTH+obVy(<`=Lc=>PdxXDpLxN> zPZMd0qEZR>V4#RDF4L+F;Difq!ySmd5L7AB`QpMw4Aefg@9Lt7TQ-%pQ*hiKi8z@l zNV3$zFY>6FV&M8>HviaD)R=3v4M!Z4%W})?8$SHZz#1-zqH5quyoGpBSLCcy2rZn7 zj4g-}*Uo3OP(sS8zAZEcqxXp)GjUiN)ks?{&Bi}EPa8^CDvg*qZjA)h;$!%k8KDp} zLyn3D_&0yjE+H%Yn?iOVQd8?2>t_^`g&$qIOt*&FaO$>fgz}!i!MdJU@)rxttP+4zGwAgT#shBh!gsu`AB7@kV21 zGTlfauHiQct>X6ry8l>Tlty08g+C+T?V{sSs0d6I&OcOG6P{K#y@+N#Z~6XSJ2sW| zD&a$#sR-$tFtZjfC3snW>ix-*JfiZMuA^+<8pV4c%bxnlLpkZo=GAiG*S{~c_MpdP zsc&kJBBvdXd_TyxbL;@A3_jg1RH~5~3s`7oSiPKiMVE*XLe}5f`?YrVv1tkWMhabC z=~vU8&YbIYuKOEQAn-m`ctuvNKFwZS#N2j#7Ape%{V@&U&EDR10L*+*Zg<{3_Vc|B ztpYU%gV8>pXMa5Qfc3TV&%U)k*dsI8RU2R3jM6-0MKRG<2?C6wA@0?lH`F)<=c+R|hw8h4?_JounZ${e^m0w~C_b+1YZG+R%&4+Y z+!qgUnY~Hp=(c2;l!Z`){H7v4aE-vPem;*Ji57%Rt`V!-^BJ4KI;)b1~gVjQL zziSVsYV=UE#Z`qJuzRR5g)yD6I5#KFGI!*Mk;Ny@?MpDI;UcI{w$YoO9b;(`GhrKT zy)I21RxJ@+)oaYr!TFdPM_ARY;Bk{B)kx=0*q{vHOz+(1s&Xe2$5&U|DOLh@2OpW0 zj|A-PJBft9gB@ZLq>pP zpq4!Qz?yan08STFA7s!8b1I-Tw$zD{6a%_9i7|Alwxf+hdp2PD%gOqC0lo+jJj8x! zl8YuUV#~a%1BbFqwu=cAI9=P7k)I+8h27wg=}O?di^cwnu~0fo@Qcha&F%a8wCt-3 zVJiwV^(0Cn)y?mS+bX-`*O>R5D9l8kvh-I)o4Anl_T?^vaC5y5Oc^%YxHkU*a8#|K z@0vJHEv;XuTfqPbhW7aN;+wV2H4wCkNZ!u4tM|ibn^q_8ZQN*z)Q{<$y--my-yPY1 zl9eg_?)}c_9l(H&5-td5i2q|(lec?D30l;ADzqm6?25+(BUn&lC~oe(WW7j;!}@FE z#Wb6lJ#pzge6wqhzxmY{%2xv>b5@CF*U9>=pS-Os>Aq)PvW+Pn{R(1}I&`X0TQMsQ zKG2zUAx3b+CZF!_y0&kam)I~k$zsO02osWd{IxQI-z79{t^vAx3_42%f%VOzd&&@} zL9MOmRqWns2A>4yrNPsK+0s9LPVo6i#q&@Eabr1GPcY1D333D5_n-l`HsH}RrmH;Z zT&~9Tlb3$Gc1Z3NB?_!G06c!J)JKUb{zu1uV48sS< zMzuwZDSL_X%)^BJh&$RNP*zrvl942d;vv0n2{cU}+Pq(e`Iy5H=2YDmIb@bncUaX2Jqv?&JCDLDY-RdXPT%`9-chkh(_~s-Ow>7g;9gL zM@BFv3%=$ulN*r{46(Jd0oXJ&naN(+XiWuB5~xHZpwcJIiAz6y)kR4&YFD(%yonX+ zBtJ)cxfigYr9Bkvffa@fieyTe-z4*t(sj85P|{VDp4oLzCJzcK_==`cCq%9!3Wo8? zl_hjS5=V(^Way{PWVro}7{i3BEyj%^1ChYK)pNkmYWGg&oaJGm)cy`gI(!Yv=*xvX z5p^IqCu$OB2PU-`TSJQ~V^PVF44KShCt5H^j_nXjI;Zkfs3;CQdgY|3N=mjXfn&K% z9p4(tRqbyd*|cel#D#|Orn02x)l(UjvnWx0W5S9Wt-Y8t0^Je6Zl@Ic zAeGnnAkShtC59NY`&mvJ##o-f*KvX8R9ZBK9bIY)YJ0e;7@P zM_o5I*GMu7DR_?7ZPvej{dZX(v}nlL_}LO|QO z*1UE3|FN|!ZLZ;3eDrQ5p*pW<|KjbY~QAAu*NW2WxH=#j;nWqh?G+VhF@1jv zM3#iv#P`B>qx9Qz9=ujF%)nKt-MD@9RO)xlL~G%ZX6KWk$TRn)S!qiL(z!<#vP6v~ zb7!{0RqGfIo}f~d__72T&WIFwCpzsCSoU_3#Rasvz^+~q2!%f>45iFiBVui!l0K8% ztWx%MH1i^a>kLFx&Rtxu`ox`^JbERo;xIEy2B=$BRo;;f5ASTkcPXPP&os|g3hQFv z_E!4ytJjwisyV;m&^esc5oudqQe}QAjA;5ymeys-vfDw<$@aIIw_Fd2C)|)ZIiX^o z(MG6nu*{6gjDo)&r|DliGdXcbOiDoqIWf1R#%^KDRFu5%M)dyK_S%rU+K=KZ|M1iX zUTBs05ly3ix9(hTu_QkHkEh1Pe`g-$ZJy#ilwBhyQ%b7;-r_k^LYVPOS8M2M?c$^0 zVa1kNo2nAgt(kVpyY=}=^zbgo8KZjPbbgs6>^OE5bx!N;+=NY?r-lm*%A6KOHaGd; z{c@gD{b>G|O%xUq~gC`44 z=R;4nfbb~I(MY{YZiD@Uzo+c_SP(9HxK*c*Q^iXsPyPPsR)m)bZ|bymI#*-TF9xT} zJeM#To1)@+Tw#?M|NW3GP}Frt#= zQJy-0`y9}41j)@O=aDNrc!@oTj>~;PHcb*)gin4Sd&q>1q~o!9V!~bz&3^Cm?Q{?> zyowb(d_q%#`8=tVx~r)J}cT@DR+m;A&$m+RZ&$#8&Cbw^T+N>sAL)r>A6pv1G}OBI}HKFELZ-xy#x970BQE(O@nPr z#e)Yab~{CZn@A;6L~pD_QuOaw&QK5v#5_JE3D98w8!K5V%`Z#oA|` zbcR&CuQk|T56C!oJ5010WB5ZMz>TE)bJX1$kt6e4XuC%67|5kviWv}syRm7&7kR6V z^nuwM22*5WwOWm}Kc-t|Vnrs>%L>YiYeklEtEnvlt5liAO<6qSYG-~fSGW7MH@bvd zL?!gd>d>3%{hby4bW{wGerTf7`qS3HDbz7wv1oulM$Qv=^e2{y8dK$un_n08;PYB= z{Hcg*%=L!qSK!`^pNei*uko%2;X|Fd1dfK;0B24Ma|D#Zn;q3Djon^)RChx6ZO(Jn zzlZ%M;Jj$VREcKAGg4o)I6(0c&;gsxSE)jPn+E-US3z`kVT}9o6>AlCbBO2zRJ4II zOg;+DjoohUE!{!r%ako$XdH2K60QAwUl1jc3(9b(ZojyUFqw-o44lTe4pz!(7LxdM z^KK(x_uOUiga`LATleG3whK!-L>`_RSRm~jC9H137Fu_GJN$Oh#gI9i7>G7Eg`#K| z(b_xCr{wDnUM$llXaO}y^3vCca0cTUsDjmq{` z9DT0iwIsmF=T_|k)S(4(CQR}_I)++Fs9y8j@LhOMQC-dNv7T1@K4=bc!u>E}pq2IU z^s;~sd%1n1A#56J)cd&3WM~UE5B_*mtR}|6zc}gIX#Q*uyRFcY&Y``3|3@u;cOr7= z2aP*IDjPfR<;jNkuQ>I8OWpXY(dhYK0XwV)eNISkj^)>7&td^|H-Y_ zMZ~@-N7g>~yP7w5^W=ZrU1(&e{`=q%z<}1odw8rlm?yc~m(4+n^MCCtb$WkEVn0F>gaor1GfYG-1 zovs7a4M>gSrs_#_yyci%1%wh$w`&o8yyvqQg8~5#Q3CXc@$Vmm{<( zNFPX;o2w6N{S~D-B3RxmStS9O8o)8Iv=Zc)6Oc$G?s7TwAB~ah&Ma&<*bRl2C12PtBFg^#l>RHsk}k4`HlnG$o@ll zD%4mrcK1BWWlR0-Xc+XofT1JRBDG9J-Lx$g)?}!1= zfMyLqrdX4#VG}R*?r@}+HZDA8ArP0?*fr^=aPR)}c9pO_y#3_Zz44s-DJ&wj_1+Nrc5NM(vj#)dw(~w0{#OkM}Y6~*CGe-`8b39DwG`5CG ziX&Y(g?6+7vvZ6eT;!%KIRoi(1&E$zh?Hc8-AGfZS11T^tMy~nJX1754u;z5vv*0M z;qnP%oEv@=>5(6uWeC+G8bQ?-T4$DCDK#|BG8ddPlGFK_z#K?R7@I^!$mq9 z1$C2b31x4!NJWX*BkpqTj@Kf#>0Dspr4mPszq`lD?aVA~^MT#ltXvPTPu*3aszB*aj}5-Gepfj)Pu@Gtf!(re@<;4Jak&%GAndJe!` zao%Pwm)ENMLU)9`N9~~Dor$UT~i0}A7b{i%12}I z@MozaSV)sm7XUU(r|`0%;=xde-`$C|&7u%H{!y#bLl22&*=*#4z|&ne!DheQ?a1rL z+s=59ZlTV_uA?TQkApd^X#3B-@+8p_;fs9vEZTU8P=U95b}`yEpSSf{4={aebqRF& z^R+V#ldIAt0q@&yLo>gOuO#LO{XX6y20OSoo`;Yxq9^h>6cPps$3rq%D&A@+zA0hr z@}PG5wJpo5rJ*M&lsOxzgqy3mE-EIB-$g!rTn~I%_{NY~P#;!%9@V7jN#u8H#GF+* zhsHWaxM5$YWpu!f4Ijkr#we}5i-^{GHZd-rRgs!D2+-d zdH^}qzM!^&4Sj;cmW3ukOk7i(6KB7N3x531z&9Tq9pUP!_Uh`2i1Lt_xmK`Zl=Fhk zO)1*Qy|&wDM|uzHa$vF~`iX0?KDmkB)8+k_-{cFeU?Ah;!Leeu5Li4q7&BY5<7h&D zonkF-^Alr8!<%^AH&z!;)pv|^yyeZ$IOmVXKWiKvqz!;b@8iA+)w-$vgPP5+$s~&{riFy=~>-+&a7VH?lThimo4Y-Yy$HOY;%9r_W_5>lq#NN$8 zd{b&SG-Ah?2M2&O+bXpYoy4lN-wg*ULT|Xs6)^%`cJJ=Ivqf(3v9b;%T7JK|!F9GK zQbwOdwJ=dA#U+arqWV|{AZL{xmeeAq&R^hU zX)G@15hQ;Wrx!Pk5Z~!)1+g*fZ!Gf@I|pYXoeabEV8~dzFJ0kB@oDiBatiViq@-(z zOeGj)Dg%;{5y#^b*gHX$?3|hjo%cTzW=`j|SK%@(ja?11^1z%L{R?$#f&r-a3OW%Y zBd7XHYY(OqQasb)DL-yF+lF&kIf0zF-Jc=(0VMmWyRHVs0UKPI z@}!=4)CdO+<%%}^$J#(-h2nfy#bjQ#R(E~l?^w;c z<&0ZSHgFc0N*ltLRH^o?bVem?KbSwfm7exM(v1 z!r+QNzO-0v)9QL?m#{Mp!n$Al6ue+h;gm1I9T}7qASCxz-x)93CpyCAE&j%Ibt+5t z24N^bRwmE?RBNjwvE`Ri&iBw^_TZR}bwz(6TNU%x?n_?oEX)g5RQPst=y~fZ2T19(+8pt9>cQXM;)D) z+i8VJr?bT%VXkW(*WH(xCq$}k85dEAgu*j@=jiz3Qg6>w4Zg6M|Sw<4GYqd#2qxYC9Cj?C%lO52W`aJ$F11sMY!7XeA1W{-)43wV*bd z`6n6|4+%jdnn*pN;9G#{+T4+kVnihN+7XCu9aY3SwrM4Vs$zEf1b2T6Jt&h33Lfi_ zApUHb=+39ibtMi)TZK?iLk@)_F12Nu3G}4I(?9ljR%Mt;er*b=y7x)vf+(|26Q{&N z@#m3iJHL5uRpQgOa~+~FSRDsMNL)0ZwnuJxw|U~gJx8v~)Tyj(G+&cx`7gj@wCC8@ zmy$_a-Dlisx2Y&m-r?nnS;_;XC}JICN*HSbxr11;IK4PwB}`b9g0kr5q#9mGete>T zKZ~Eo508&Zd=b@5kkSi2iqacksr37lW9ug5+I+GidETl1R7}ggK{9)+*wUf9Vo4I! zcSXWmq05N~7JTogLV#pdEU?_M+_f#JrdZm=20$@~o)o$j0F_dl zZVg%VMjUh<+heg6?hKYHH|=er>$a@xU7D2N0L}85bWq$V-WwEg!-xiRm~o`hRlw%e zhg~zq7dfzF^rSf}+$ypqSm^f1GVflL(->m>)TcmM;xw>hJ}EZ|3;kQl8ez_>33T}a zMy)+}d>e}H$r!@iq8!$n`*UL?(PD`?f=5+SJ&FzkT0U>fx?`MTw>3`6`s?5-ZM_c5 zDUWS#?-TBWPHh*O{Cg(P z5duV{-BiYo0%w8S0C;V|Issf^oo7H0&4Pmpl3y8)d{H5F#2|L;nHOoQRh1{)GwLmJ z3gmSmz?$;p3Nny6Vj6v_ttVr@`vCs;Y;bW6SAL>NZBDb8aA|-DdwK1nP;{o7aFyes zgJ&Q!zIK7KR{nTMcWodr9bye^f?Gk3(+vwIkj!z40-)W1HJOBPU&E0)rP{g0k6=9?oc1vXg~LytQ%`R(xl@?X+^^Z#M%t)trb!#C}g;_gtqK!M`!QrsJ? zxVyV+u>!>k!QI^{1a}DT?(Xi+n|}Lych8>P`IF4V&LrgX%za%qB=w3nlE`|rqBcdfsfiUg_PQ_GICg8z;i>t0&ihH#o28wO-LK=&h7 z(sczy$Q%& z0H{T)u2BD;RhZakf`1W{#1Ua$AEin?{Ebowx&Q`)XT&z&MGIw50ZeL?gQ5P>58S3s zxhhS}U22fKK|@8AAsR&pnUX4G3hgBz0dyZcSH6emh`Hx=|1Xr%1{8TukHr-6mnwxY zp{n|%0%D3-tc5f%`uy0R(q-#wsh|jF?k4-QCO<%o{gyyLLx3`Q> z<9;yTzSEim|NhxSD@(p@{hIL0e{*58y)$#*+m;`Z3korsz~05kWBZHH&D$-Lq}yWq zH|RgU8gD0hQBRLit8XqZ?LtDgYkp44eD_NAueo=x3UB9~7wh5J9UTr{d$Osb;FWU8 z_D51ZxN}}zDekVV1Priu*UKutKYJ+ zoHyRkrc4es%FSi$I5h`cY-fBA%klQQ-ufg}a!BT@m=)Q?Cs!?zsr{tZuy=QZ&aLGYMdjqEj#ZmFZ}uwhT(dUe2IM25^A6az;0Fq(bqNf*%|Clc`GXx*>zEUN(V)A>3psmfBJ(|R%x zRP&15S)U&;}n9enDyyK|1Jl?rt!=0vi#=Q$K-7@*6Jdo6zf)=b-E|BcB z$lA7Eng}2_WX==t-{R6%23P-(1nHrQ$8u_|l6ouGt4YVVqK1nhjw&$#HW%z*4^)a{ z8OKsl0V&8N;UkqXPvvcv$CtYO(S2(ZRBv~0Jl`@hG~?RoO9Y+O1|=PQA9U~vWTYOq;C!QF+d#anEzEU65=t+(WDQ(9WmJcKyPMOKlRe8PfHwCg5jt^E z-(+}D4Jsy{DOazy$tOn#K*XSjTIDhhWQg~}5F;e1k*5|4F^xEL?eiDZOuZ|dN`uXb zTn+k4?8wZ*cR$-7jm_nC!*sU?PU!A9>%THwVIj#5-G?qPic#!=_i$+a7Pbm(ZHF1R zhBk^2SRP&_qYKP%g&F9=rRuuUn6D~cE?)dzZsI+VCH?h$&hE}$-d?Zh!lV+}Ee@o5 zCa*7-hj~L7zrh(%599%c#px^jjpnE&U$5M_idc=lY_qV@Sk;bH&CS_MM4t4@%eU}e zTy#e^Po^*fCG^ZxDd8tA8f_WUt zr1_clY$Nq-lyh;{-A-YE_VPS7?fQAJ3#MQ)Ltd3Jxl8BXsyV3=_p)^EFUj5h zd1OYN*eV`ZFsvq+YlU-6Fq%T&K3J?t)20}?sKU6Ho0_^@&>x~QO-J7lE z##CTUKB#NBp-+%5?FFC+eAHY>EO}sem_DjKZy=BQ+OLlv_f+TfL8^hpDEEj)cao5{ zd6>41f9JM1Os<{D9{Z}a*tu|`d483nu4bg5W?sdY99`8001`MPOj?rl4D<*zwlKbT z1#9>3qS6KN(*mRlk>+a*X)sj>?%6Bg0iMp~@#P%7cN`*!l6{8f9W-8|w8y(t<`!g7 zhDGYrQ{^_bbjXoEMmm7K+8WE2@smlIu&J$*pd=!P*4QRl45j2aVxsin-z>?_`rlNq!;e__$XNVkcAOQag9kbDipMb!sN1l=1WMv_apLp}JE z$Bp8!ee^EiK0u|Zf=5mk)+V7)nhxt&;%3=~yKns~H7Sm<**3MNz$4dQ&;c+eEJpl#akd|ubsupq;B_{7O>e1o#_-F^?Qy&Je9R?mMCgD} z``wT1Dk3UnVUmL(z*%}p&+v-J#rTli82p7=0vXr^1E`eAwAvR-| z;&r)xN|w^jayyYIpcG$95-qvUclNwN^_^57M*KK*E zK?vr$0&mgRgqKJEnA^O9Oshq)%@px%!2L2G`~fjN>r5IAN?7@_r|7}}bE-!pCAG`m zn*BPrkd2)d(3x}RIyTSYxI8#G%Nf%wSxc}27q)xgOoXOfU(eGZFvxj1FyiXpdL*`JDv*y`gVCL( zcOf;s0BNS{q_>#ZROxdX!3z3`&8^&7?@H$tGE$>sgwXJYrfG9X1E$Ysl6VSS1!xR22WyY87GCC2eI!*=&c^%5itPBTw8gnP!@1@t zBf-gQ_>Y07-c9Dyyd}bKT|i&|IF3n-!Pt zQsI3kkAT+S$Pi+k$ud|RpI}u#ht_3V#7&*5>Z^k6m-E)5(g@60^YYKdjY@61MaDY% zMl*hh9orCRRegUS?`~#`5=~KC-14KlluCaV4}=e$qMn61s4kEW#HSY>z!|=iA7ZbG zJU}3j*M{d9!>xL)otjt?s6{5XvU4bLbDzp#`-UQC9^cg6kXR3?$_qy@>RvJz9^Rcl zCB&nNM5y)jv{x+Pqz4SkU>}bZ^SmEZh~hPa?K9?oZ)6iCfu{hf=SsvF7D$oHVF+?Y z5>>{`(DYwf?5xhsuvZ`aycOyW?d#Lv*b1ktkwyO$(8|=n0Ro zT1#M4VgK%}=+iq)^QJt_7T#vw$%VT@A)nP*4lcfGQ)U>^l-4J`x~M3IVR=U9Rf_{6 z@Gg1v)(?;Ejob|nrHu!ly#TSYvqi9IDU&MjNg0q)?*{mxNyXPxA(S?LlpYepY*4jj zJG6g4ew}N@^?H-egl9GfN3#6(LfY;m7jTXmV=kAjeBzS^^{bob%K{RG5PSq_-jD>>w{7Du!p;;Y-Mlf^6^JaTs9a@ ze`7n7_`dHZ{G6M8hzNkhi35DfPLSQgA%XIe{Bk z2M&T@28#Ds#s$Zm9I2)2;p&8RvQn;>#~yY9mbyeK2EXUY=?ivljS4z6Be?*z9}>Td z>=i$dUmqi9P!%wtf>7xl4&*imVM8ii9Ya%x@ZSf5zh*aD*9A&0=t^82Kw$*e**UN8 znrawELf7#|Z&Gq>J`50-t2A)7A|yCr;%YI>d>^Ailr+GD3oQJdOzST;WM;tSwnEjc z@8SDF7$f%LL$uet_7EgtHVKng(|{`ycrat6xu$ZW}D@nWgHYTW~+Qcbz}39RQPN~$0^yD9Ov_6MVtA+ zOnf7!a@t8)SZdiPa)*yjHVB>hH5N-+Nje!Z0jZi)?rFXP82;2@tnaB^ZBx2q6UogA zt@t~1wV=aWt``FDf>QW6TWIjkKg(78>Rw1rFRaD(B+(nik^0gzF!8-qNmyNS^Md_L z18zd88L&! zFvZw$Ej_eolpHxt&ExJ*<-dwqF(;QcXoQ6o_5m85WaYDT1+&klmiK* z$6J=!z1d#2BMTFnde*qvcb_1(j)X5|rW8e0N#_lPCl;_mu$;YN$n*0{(DvN_H<|(c zZ}UZ<&813l+1m!1o}cs8)t=w$SZ@34&9tFEC&FL01+;Tw1A&3E`b{$(8}&$ukTWdV zJDA?AvgWwDD!pa@?t|X%c7Dt0;q0t}5`4I{)Zs|LsnxylFSv&HjrqPz6*BJmJBWb@ zy#@xPU)Hm5!&Dd&E?))z3wpI%mynD}*LfNQ{Uv)ckdi+C(}Ml;TX?oYv|;~k@BcR) zw0b{&b1g^xFUi(!?lXj?mIaBGm0j%b(|qSKl`H;}q|DR23S4V^!i)tJB+-~q!g|SInOo0d9L(Mp$&R|&{>mSWzBIDOO z)WA*Q{riO5sD*l{dYKmTSf7uP9Jg{?Gx_FdP@Hls4w*Dj|GgcTphe2HyW_t+&_wUL zvf|p#$wKucV{o}c1;e{N6 z%62%;WkC6d9;dDuE*QKXrBxo8nm{PumdLUdK^gffLT;NGZr zY7S1%rVp0&N7JO;)I*&FzYdfD?f`K*7j+7)nB$H12?w|jOS*9akCylinUvC4CZyAt zMe$iM5b~;CH=d0-9}tRJ$}B@S$DkglM#YSDX71CbJ3KQU#*{``;0QCT03(f+%I|pH zwiquQ{nrLSOUCS*O@1${v}3RJoXJcvEJ;GIyXhXTj5-f}t7qM9aehzXR+-n#M!{RM z%_%CVJ@kFU_dRyLZ!!0d|XTRhhH!Go$5yWhJ77N-PA~)NHXv)k?&An zUuB}lH3w9fFjr(Yx}R(^h0@}^WQs))nw!oKW+Z(GG3_4rBL(B=ezVNCKfjJ44I8&y zN4EZuLk{k66S93c0s9Q9e{o7MR~!Nt&XEWlHn>)v9YDTarygDQ;*Kz>wx;d`_qDlx zI*y1v_B~UBenJRD78ITC2! z%Gnrx=u{S-vwQcpsoNCP%I!>6gmifN~h)rHoVMQg3}hr+QGfaC2jluAZlg$QWQqJCd27t z!oY)`IjnIm%&=Z{?P_x&YzE!5rUUJtU<`Zq*Q+bebUIoUsPXjY`${Nt8+SD?S8e0 z>&ax4QQwA(Zq{n1J_X(Qo}a>zy0LW^W82z1?50OC+1C3wTwO%o^3*eC@U$-k-wM6m zza~sN831>P96c_sju`ZoPg^|pI?IJ41pGFjzm*=pwle-1yz5e^O+Gf<>-J)E)_d(5 zzEWajypk%ok%5pxv8xuc4+vmo_hGQ(tLN25Ubknb62Sb+3_mR z>UlOdszUnDsQFo=(^2bPrH{Lvsdd%f3Z34o-`k!~5Pzr11n(l;shj+t`r9=hURiW6 z@&Ou0n+IK4KdZU@NUxLjmuR73HlXX#>-GG7B51L_VdA#8JSu8nW0@eqV|=gaiKWT9uUtXHp1tSe z{o-1-Ld5C?OI;>`+KaQ3x0$5;)+ZX~KD?JRFAfzv6vmTwejZzDeobDLHh;>!{Ijll ze}y>Wx@5VXN1yp}h^W9`xuDyRTj?bww>dnuI4v&qO=toHm8EQlM|GNSwhz-sD{YtU zl5^ED z?KRIQ8&mz!x`#24syfN~8>^_C=`R+_wn2=kk|20~t7uy7)vm1~Z`$;5ayo`i#{!T0 zm~T{`0V)iMP1va8YzG)Y#;W%n{B=ZRsUW)9+S zrLCbZ6QJ;DxR*{;Gkf@8aBUXYkf%Ta^dN){2B!<#%m!hCtmcK#e1VK zqdFIT>sw<>b2k@`1>W1gfxb_pI%!`Wuda?L%uRCK)B3lm7fH1bOf=)t+*Tj9!$T;5 z;i1VU(_3Jjz|?2^3w$|3r}tBPq$^8t&9OVXPIJzTlKJb@dkSn;UThSifIe57YF_j7 zx#AX=RvRtkn%1NflGN{;OsnmakqQAhqgW^qdYIqR^J8sYg4m6JLR1wrc04pZ1@+8*V}=oCMmI(tCd2c zliPDb?OZ{ao>w>46`>hN?U&{;!ix_#A>~9y(DbU>u0u0-YkK-r%(6!94^xTdFX76N zzPjR_=I9W&{8O<5ZZ)g@kMgN15=a)~>gbgB8Umk3Z&vpuQ-C<*A3o(?2Leb>>^o~N zX$Yc)nr=Pjnm#27SSj*fZ_lS4k#FvHbm>v`QP{fL9|G+L;G9W10+ z(!8=*O6uL%b1RNWO?17ecSc{l3{!<^lR@J95+8j!GBy3`EdU&)N3CBW=^B);Us7v7 zUWpJ8c$US#Fv^lNtcRSZY$QnocA*v29<*MpTmg*WE^ zh0uu}D$g0K3BhtByk@T{?xjOoEvPEe^<^}J_s)*$0epV{EQmcOrE>t}Qq2@x* zer2x*fw)>j({z@I3Gt6Lvb4JJ?p|c=x$qXjisrHUrrtF!(1n*fI*7aJqu-%qzo5&Q z?Nzf%mQ-2=8C(_@1%(L&^L=OgQamN~c)Kii*2VZeE0--vna?_LO@O!ItKmfmc&?Gx z&rfn~lQETnOmnncF2rPLU0J>eYMCm{FOI$+;3p z0OW29w48}TjWVo3&fOGJjbAXr3&CEd_)+MYHO&%nWn*%v3}=eayae&AA)7-cgYhUt z0X@Cr`MY0Fy>pVKDEpr9l5WvWtjr|MFR3p32a$ut33@>xz`XL$ zX&r>{KX<9sifZit%v&3EY>^}_WAc&T=ewjW6G)k{T(RL-*x6d!I->w^4vKnOO>&kA zO4CNf2(6!QJLsXtRI}>U_{?tqoW`Yz9uO~ev2MFx-%cq8O(#GPy?muCo-K)i@M5G5 zCD#7W4izfEuzT4hZ2A~^tfjAb={WGGI@HALDA0j9c|%>z>?+@a5NJV&c}jqNPN*K5HDZ*a>9JtZv!IhfA{P`9F;aIU zH}c8N>#0CuwhHO$2mpuIJBpmxM}nX7{s9gzjMj`-%jTYcH1Z}gYIUIAKY!vP_%@^X zOW9)H9K$G6pyt=nHVb6slPj@1aER&BSb)VOpM2~SlMr@G!py;V@ z<|&m3EKA}c(fAYJwpB2cQ^J3ZU0Eu0WVG!Hs&KcyvEG@%%ig-y5)9s5^eT|Vg~uWa)YuI?WkK<#|P3x{r` z(;ZO#cFjA`Gtb|D?(FPi?q1Sr7DagjAM`viakVQ4uyLAR%@dJ3;yX%4>O+5eO%tX) zCd}~3;BJ-T6h{K9vhAnMm`0WT&=g#TRnp&7F?O-0##Ex?V#2!Kt*>Gknq?I4f9JFpNkzdHw%2gGehl{j&153 zK(+)xKWoutjTQ33CdR15GaPHCX&i8mx%P2RVN2txARhGeJXC#?w`ScL&6_hw&CuYH zwUCgC=j-a76Ix4HpU{%CV)lv?DpLAg1d}#yd_`7&d)wg2nb;hRwXoG2*^5*5l_`Hx zjYmT7cD!WI?l(3;x*>wFsVs7j0HUff>JBQg=EhciCl0TAHBtXVnmlGS#RU0p%1&Ro zT-KUxSbsTCRls-8+Tz`*du8CS_8`;hpu?N|;Cks;olnW)2oEwFwe};Qo^#shTtuz#I1OhBf%$FCVr*rx8^Lg!4juL z;6NrYOD(vdN~fb!DHj0t>wiip+9S>_vlfKiS1gbI^G*NDKylFY*!xY6Qs z&k!Wyd-5bpma8281apcX@)cGPqn|XX;}>ps{?&{*b{M78CH}npuR)wK$58wxR)SxB zpg9(88-CZ@0x|*wrt+*Wj^I^Th!{Df#^Z7nSA!r{CSJ=OR;O&KH`W4iY+)<%=URTc zW?>0&vD}SDg{Pc^HG{1ITmcKF75Tz(wbA?dh8DW4-}|8gg6jFQ9HyB5pXw!YcBZTk z6mnVZ9nfH^lr9qaGMi+Y)=7l)j-S?BU@NCnR=k5Oo4_{EoJ9Z#|&2T`Ex)>3&0d;D~LHv#T~lxg0fLY5+slfRQxFHhV4 zlK;xWY3|Be=*QfWarSN)u9Dq@;N_k?uiiz^ARd~9UN#1jhXM_zWMdOK;>u;qEr^P=W_E7RnhhXFmO z*SYNSiY2bsj=b-W#Kkv?Ky zlMaBrPz3%+|2K^RysD-~#ATEp5|p<{AnonR@>N!wSc{G7_Wm=q-g?`mLL4*G_jKfM zI|2Vejt@H*tu~k2+j&X?zn{>0+l*|s#qb1X#sA%CVi-!YXSKHXmI}@LCX^gK<_!H$ zWgm-*hKA-V3^npT!EM8@a?0v|kW0iv?f->b(wIX``F}S%?Egm;>V_bdUqC>Bza&J~ zLhsYYK<~dtgmE(PwHr4{wPq)PgM-Tp9o3A=Kg|DMq8nzs*E?8gwZlaP^C0&!oa&zs*2rPQ&u-jpe!D31hVG=N{dKxbg0i~1>;JmF zf2^BIZPglh&>cWQ@Qc_Ne6=C=8IREv7_#Oiogzph@he%qE~!FqHNGf-l`Y0mQ0J}Q zaOx(94)>P|(n0NrF$3v`cE6)f@~E;CN}QS=;c1Cqz;umL2<*3xnR#g8S;O|9fZQ}0 za95rgYUw43ou8^@1YH`79Lb1Lu-OLAh?kraF!8jjw`)OlHerp>!m-l)3AL?Z0g_yM#MaBYt!n%}geT$Nl(-@3I+kcY0TL z)!L|C7UxLaHDYL$FV{++SR?t^TzNzP(XiTSE(|C2V_NmNhyNbNrTV@7p z-o<9T0dl>zkM<=gS3d}hJ^`q3z7%wvbsBQ&4!8p+^v4BR=il^^>FT)C!^~UK@;5l` z1P*&;kViv}%=OoO&vKTDk#}QH-RBeKsnJqqKGS{#OovF6`MEY{=DYM*^>%1vLVx8C z*-@Vi>?Id^+T5T5>{epO?qG-2%&knhT}j)`-IvUth7-qiKLo855FZ}-aQ~dSH+l`V zGPj5B{QZc?^w@6gRxE)xr@S^-Ao+Yy+P*Bm(3Qc? z0G_{*g9uW9s&8rNYOXf!9@cy7z4*S5cb2{?jxTdi4Dri2^{9F+TV`~Z?6j=vouF*R za4AwIzdnk4PW)!+LA*VuC4$Ed zYRJGA@-*X_k8n-wM2d@cd>_y%<9D^8h>6P8pPyfg@tN}Fz9H%5Z(B_hBo3`#6cN|= zaLL?L9cYpSW!%wt zzi8JsLpJ77E?;ou!Rp$GCX5!BqSl}k@pP#R2EJBn-SLG=U`6{sUzq`B!pJP_UTdkZ zcI~%U6V=Xchi$Pg0Gf+G=O(x+b=s#`u1}jY1=5qB_e*svQr0GC*}^(b$Ut_2heii~ zwz>mfoCs5!laAEd4|TUD;I%SWty|Xw?JM(dG?yX-@nPLOfN9gL^%nfK(tc7;4Ru$( zd*{I0+c1F)>co+0ByHFxyFh(es!>Bmjho|2l1Q1>HthK_*pSD^GZ*APcQH#&}o9ozrIDu zW%VNJ1NT;FOpIW;>=*U9b>t1u=~}UnO4X0I5)$Aj%=Lj}AAFq*98q$SAf|_MLpLi4 zyjgWmCwjbIvf0(QO@q7b!^_*lmkfszk+EIY$~6zimy7Z1u0`0e_UhIN0YSd#F2J`a zG`aH1GCSYfofo)Phc)gX{$I3b52!fttnt;YaDHZn;R43@$1lRMO)R)Xf?A9O%cfd{+XgsJhI~j-7 zAU!BkZ&i#nhUV2RwIDO7Q{khq;zXXCnVXv_R&`a_r|=$?_g2J_8WQ@7 zUh3F^l3VAq3hvnP!Z=}+s?_~sd(68DYKh~`<^?~7b1KL|F>)k7r51WN=Bl8f0&Bv= zVJODd!4zg`)L zN1;!T>M@*433iI8c7J4MN^qpYox|f~h7?h;@%5wd2UEsimOwmzF(PC5wWp5NsN8MHs$9zfo1FFAez_|M< z@g&$b6`jXiq1S%n?1&_4f&y7@oS4_ z6)8H0nVMPx4zypP5-`-|Jeo7iRIX_#JaPjk3I&3b`y=}4=ol7PIM2qK5fo`>`C@?U zQRwI31Jmm8^7ztea(utNT^I6l720Y;Ut(lz;b?e#I>iDVJP>yY?t3IbW0D_byk;n~ zJ5eksG~H!(<_(+|YHVne)zsB$bp=_WhLI9LmL#J3=EK2t^2mA>>{j?hk3i~`58Pw;gnMn zeN=cC^sGIDyU>O+&YT*$vJh1an;2az zD3`+P&s+rl0vpZuZGwu~nZ-Mt#Pt)f?wJ~R_TdWwoDrr{gmPT$5(ed{f9X)NhiAo+HMJO~ zB@g*r84QmgWdEYhbc>AgX+JKQR>%0!YI2_;`}tl_F9! zL!5|wZV_={GJOq$ zPi5>mb(db8?V)*h_n0rmqN;~~>{e^!*p5Tl?&|a^l{1;Xhlf_D==#cs3P@iluGvZr z^xetdH8Aw@G4TLw59oS&-m>*>agCMP*491kwH0v@%5^G~x!zK;kxJy&pSpdcKXvGI zeCSnKk5pmhN3GjA*zZUDhKJnxg4IYGV_c42zKvy8Sp=-}{u3LXP}^xenJ6t*`XI)z z_AHS8&ckrWnhXnVn=S0Bu=2+7PZI3HvsrY2u+daVzIxs7BAl&w?-r$ZpFwd@+N`wjlm%_X&VpNiQVpA-ZkVvG}eh6nHoyPfMoU=m&kJbZ=C|VF<%ej?^&ZMQ- zy(me5^mJMnqi5l`RYnlTaFoL@I<97Y{wwFk*ymIo6^0-9m{|bY#vb8|XS0?xi(Tus zIVOKrp96R1%&70eX&QP38iF(*dwxH@l43#7mmh!E2(LqaT_66tKEKxW_b1t!0TAia zM&;_}%ElTF`aAN1Uvq2sAEExsBnTz_Jwn$GxCB`@iN;?mYG@%>v8t**7W$`GAIfCU zc~|}|wm|QX?)-aKi8eJ8=0qeUHHJ?=MaDJc8%q9LWPbJS{ChS*Vh8>|lrz%Orco_} zWxlA<{#E)wgmk-I&#PH;^Z)8Ru%{a#r{8};hgL;MtoCZJ0)nzj780lbigiAdy))U?D7cj={kN!8ym$2pk!Q3bB=zeC zy=!OiRm+pm zk523R5_eyB|7=j+OFBxt*S1%}p8jQ@o9+&K?Hh z^B>66H+mc*h?V(kA8Mh!-$ulN*fnlVAT?TPbrST-x70HFSnQu-X&f8nKnDBT@B}6cj&)~C?4n3xD76yXeiy>(P82{Y2# zzUMp>!w_`EffUrBcx@(?@H|8~H~yZxq)L_BL!x;3(2U5%9AR9M$Flg@GW=`xnG9|O zZlU_tuLRUGRFJn2whT7Os%KSOAvVnjV(u8$FWKoQk={0`Mkb{by7CRN19bc(Z8NM= z1_=P7_Qr&YYB?wjyKlhXKbs+*Nt2n+TPgB;j?27=hy9#v;vp|dz6o?SDdP_$J}tpN zX(s4j0<>l}->KyuD`U-tc#S&WI{j7b{Z2#Q1<<%-}D=fM@oP;cDY~}s3 zCx2_2WK~O>Tl<*C5G&$NbRL43MZ+6vjiPd))+g~X#8f7IpT~>3F%l+OdEwRthVNS2 z5|vDf(ut@ir$4lQyk<>Y{nMJ9fixTI3c%!-kts^3Vt9C=m+w1pE<3^K%v@rrj}fp zvc`*sP*ctY2v#paeGH+anM>-W4HvUfJ$d?YpvkYb4D!e)2wz@zkPN@D?lr!VLa{w* zldN$1aUjB+Fmck{Lt8sZgq(*KyMT!iXnUe3`FrQEV2boUfF*hIUBSn!Kf9rLR-9^I z3#w&Y7$v#S&baN zD4swBJ9Zlf*z(mpCS7N^EeS9EH5`|a+E=N*WB9-?;(0vz=JziUmIp%=c-GwYq^qDg zcp90sqByQ(Z-{^5+bU25g1t>Q@M2y`yHJUaLtNlYX%NMwaKNrxFhip3POhO&V&jl-WgT^AYoUgkXj3{roKC$Q=MOpKT#?tK#H@X+ zeMv{bBy8U-^l1w8vL0}Cxf`MeLibb7Z|xgL$~cbZ284HQBRzD|*4 z;W#BhvPCKgt?+Ltb~%wi}n@@QFMvu%vcObuIn z5N)pWn$*YA7<1T=15WRq8L|NW>{+m9C~OUylpMrcbBQgniWUq2{kDWd={)Z z*#!9;zhQd;VU}kt?~q~UDf_>Q+qxoGgpO3pq0m!A1zR6(!)hGK2U0OR6m`NxbfsS| zAlm@U?5#}zZ}-orL+Sk|*`P-%knNg9v+I)uxT6a=oAKmh#VR{(FbQ&&gRmu?NX?Lit# zooHhQ4YW%n{x$x2j_#W%Y5F!+Xk&`&_Q*|AR$)J-=uhY8pLt{ZPqDN&Sud@3Yy zji~=~yXMJW1D>R3EC;zp3c9mSa{-po8cnGaNd!+@ecShZmzWdG5)kfBR zp;OkI7yM~$`6HnO!y3ZWH44^oJ4Iu27OWZ!b6rV-}?FXh?kC=Cak8Un=>vG zY?#mFqSu!2S?;Mv#-}{4WK+`wO*N4Y-=|&Jj)eDke$76pKOIPz^}kh&>%xqN4j?RDist+2)dxy)ym`cZoY-nh zMe{tZN2M@F1WtwYuJbm5HQ^FM1AM~NIoY`XFjs4fWRFzc9hE!)Pba-L>wlQnW3e#_^H~2DwS&(?_Ftb3^Z>QH?CDV ztepsrB8C0-3j1X}zau%`H(TqHoEW(qyzQ!$-0)7*ndpC9RU#v*lB^$e3!%gEosfhfa|zwdKQMwv17p{Y=PsVRo;fEXU~watb$aj1^2at7s{geW+;5Aez^BurAiUsrmaJ5|IMT>89R$1 z_G`XEr4+=%&Z^v}wur-8K02311M#{JfRKEo|G_`2rDs*N1 zQ0kNs61fE1&YjKU%U!^4eIUfG}mS5q?x*#kat2Dqsu0%caiRdeoE z17M-0-O*RQ&VEOEL_ z?{kL(``fPJ55`{YW}t2AtH;NsuS{TJQAs7@2;b^mO}*KV#4>+E{JTMr?Z2M&QlzE5 z{r&yrC(Z36LbWN;2yB?YEli(L{lGn_dX@BQWOvtCvafooV`q5q>=+E}xf%1NY<@Z(i)8-|8vHv5bh33njt&hH#}y}|**ukE(3#5;Z|?7MQT8pEGI{8I z8QwM-!=32;G$e9$S6EGMmWew=yMfUzb>1vKrRSB(Godhu5xov|dfpGMA|J zPeVE|=(iz}UoDaZL25#>&@ZKttRz9Bo!SwK0#KENKx^2L$d}OqrGwU_(lZLgKZ5vI zXoV`)+*FHbK=op6Ied&Y?Tiw6J;c1P03SYIol3J(Re0t|jmMDGXryP9%y5slY=`Gk zn24ZH<+7d8Ge#J0@&$CW7C2dIztD_>&>-r#Ga=Q#Q_M38_#qoM*_iU*vo(7-bTo7| zm`2#a5ANg*_WKqkal;N%yLIOKAasXh3Iah7n_o({Or9DOzi}(Hn&Sxbw%qj)BC4wQ z6r14l-mRKSpl8E;-OQfd^}7Vd?|XxUP6%lfr7+Y%4q56L4lV@@SsZ*4cwhVZwDslX zZy}aZqr5vaefyPJia2%N7Y;sOua|j3tXhQQ0`Nwqht z>K;o42E6rTw*zDIzFqG`TTZGO4^5W11wv>Z!x{{vu!K6ado1;`sn>Gxju9w|tMuWn z{o&Qol(cfL7+vMY|C<;rJ_tXcg7Dj?y)pt7PjBu3y&wzatrN#GFYUnHmFS1_--~wY zpr>l}7ZoB`4Hu7Wvl8R)SWA&&6~~0NS_qdddKD)A;~nOIT2b@Fo4f%zh~TUD9c;MG z_q?Hg<0w?>pFj1M#FXC$QI!s=4Su`6GBFCDM6~b3n%-#(E|ZOVtE}D!qv{m!lKc95di7ZA7HE!* z`-`$KUh>z}LW~wMdFqx;e*&%VH3-&wLSh-G% z6HU^}_2=h}RHTfLhZ?(ed&`%0$GKYToQw=FUY_}N_BG~43x~F_pUKUDx~c8Dn(p@1 z24Z08V{{c>3jyo8*U}PK_-Z&s4|sc#d6Qfo`>tvx!eC1WcZVInUEA%|GP2~}=w}jI zZJEFr%SKk5s;WiP&75b+@wA~+`2b-5(%RlqHU-^74jTYhJiPH&%22Ul#K@5XkN2IC zs)^ZbcuQ`l-5HMU`SE2=|J7(3w7fRJXXW9>6L_ePA2 zMSP`QoC!Qzh=u?Qx83z}A5;Dr3#Wp+mYbLJ&r{bzNcFX6yTNzVIV;m3UfpSEOcO*T zjq6Fa`^O2Hm#w|ioNY^%Ai6CURzUl0=bNg$|LIKNQgcU>^$`JX>wW2Q#S0z0OngOJ zjr%Q~Y02u(qK3m%H3yye*{xHAW>$+f7jL*ZnC>B{|mXC0efqB3!2_DVL`k#Gy zyLCE0XbuWs9^)ZN)y=_G2NU$r!@(((kTpB zjuO0i`l11{)o+!q=h_P-c41u z1|OK)>0d-MsZ%RX?z+g%O3(6`h3^MqnS`5I)z|nMwUzk0pv$6SM?|=;8o@|qLXilC9rB1jSbxB2Ppz9j z;eml}BAVVPOl2&xm>w%&SE_{lE};&RRrQkO?9J z@mYcbu|Ezs-NVEMRqVi$?Q56t?l?lSOhxg{PuemY8yj4)ExSdYExc=;un`kyP^o(^ znPSB-72-7J_>G8RR9IZ*42B(R8FbWS()bJ^KVY+^YxEc}eK*v!Wn60KO4Ewf22wb+ z9N0sytQR6gwdocH0gf6SVdOYU+@?}9yJE}J=3xaJ+Gj{^=&Vskq*BI4r#4nboZkx& zOdLs3Ok>57Hfv@gbut+8fReUgmRw->K*dlmVs7oi4F~1W#7mNbd`=9)sdz9XN&5|9 zS@PrTH}oiqgN?+EL?Eg~*gnM8Iv zI8=ue!WT3|FIB}t$e=-uCp~Td!YgT~U~kid;?OQ6l8ntN_9Z^5Kw^&+phcZZl!5|L zW`jMglD<#`MW=2}?C=;TEA)EY`tPhg*S=&y@jmptp{)$uv#%V%;C@Q>Jtv5sPwL)C z^X(M1X-d?$A^I@erC#kiZ|Y!s9M*4HcmjY}9YNCI(^1onF0_}n_?6hiCGacsmv`?f z8!`?~zNU$V$A=o;{Z|>-pV>g?NQC6NXHqY(JSC~5%ov3y;SZ&w!p<(^iwnGTouYK% z*}a#pkVlYSP^)l`^L7zPL`dj|TK#$n^|tx}hxG4ao}l-?wRd{l9cb-+l!jj~`40%- zhg5%e58|^)T#BoH_l;h<=3}+ggrPa~C&uWP@|wd5=0ODqwH^8XzdJZ(^8_^~Ct}&N zw1=P^sWELyVS&HxHSq5`#$}y6;N$~H$~X?fGyeyg1iG5~u^)Z@A3!2l4qq<`f-Hi8 z5XWNc7K!)jHHZJagPmj0Qf~$wjX|Qhxp`S%K9NJ^RgT2kf0)Rmdg2mFw?*;_S+h(< zBL;Z3o%vQk9e$JPuq}I3LZa!HSR)GlFGd=DYOP*1dE1nobC){}4$c|ZjvBA=vr-9Q zUmkP!g8X-o`)gculvtmcO3_xBVRS=JD5mFBrx4?(+bfXQuCylE*S(yU$Q} z=U`{&cp1Jv(d!?p?2?<{T;IwhV#o$6W@q&jF>5<7i{q`3Gnz$hXp+yR1c%g^Z7steRszm>_%jNCo0`g# zx44a6W^V_?$7^@vt{kfpz~boxn5RHfTg$B9VWS(u5S_AZi`Lgi&FMdM_O~j=FH=Qc zK=r2z;~O?%->?m{my{M+ABO!d9%N*GG`?zi%f$7NagC=r3?9WNxnD)_?+1fX`}Iyf zhHwPmgojUa5=(Zz15THc`1pA`86RU|pBwDc7HOUc*_TbYaxYGCw^oIYgCb3u^X4)< zQ1P-$He$>WPR)uz?q0ZQbQl0L_Jp!VK6{;kaSh@smCGepXbz#T*(FBTsxt9f_1od+ z1f1(&@lM$^3pJN&*$fF1WAop1!tFZ!4X}(MnoX8nU`(I@bM?pLh2!%@hTaLG7ESvczE)vxeKcJ$MsSBQFr+744CS$R@tu76|FIx~`kvPFYZ5$6*BQ%%co2Pw(yaRnnb!3_1nYiu~gTryUi&JjRvBu z(KfuOMabOFsK|FRf0l1D$-V)E0aS_^*#M7?)TNe=pd1PEEP6YqmI=Toq;FHih>3d={AB<)Rq^)eY*OIXc5k z$KEv%SuiDoxR83?C{ijumBbbbl5r|X66?c~-{c(|l(L<-rG-FxC0PWVnel=SX1uK8W5gXd`j3-bX|fQG(2_D88O& zsh;>YE?OUY+=sHX?_vBh&*RF@#nYluxohl9nL(_?Gp#P?8gd^H&j~J`N}FqgHOWC7 zTB2co!)j9}RXQgXwV^b< zqaBfX_(n89VrG`Rq*ioy6aia2T_?XoYM2OFrg3H1<(MODqUQ9@1XcT#R&;Lu98aP} z(|rjcp5`SRHu%RQ=ar+cROVg?eM=DL^i%52l4qj}zMM|Aoi2X1o*3L={+qM+)(&h* zMwR&~adMZ{|tFzn~1t~>!64{22-H8C41Ks0q)O?t7aL!x zA2t%{;|DRvQ`L*b#b=!tsb$r^MXz&fYrtYa?`V-}#!w~? zVZZqycKLc~OLrAK$%>(3>12Ovbe9PW-mwR7EhEz=bL-lB`HLRVL*M_f2V}24t{3Hi z=MkN_~ku*|*G=?6iVmADHK zx%Lm)DTeqInAbK@TDe;K)Nxps^s$`+MMxWfO)$Ok_`XJpRvjL?w22Ed7+?sk>eA^6 zHD0DpXba>_h^pNb*n_6wRJGnPgp3xhLMsa@kAT}NQ>l<$Ty@SH?3FEL9M!)p0deY^ zxwg7SI7>G71v8WavOm&vgvte9xHPb!lr&|)VzbBreMA*bx02QNLP1lCSXRQkLJ}P| zo_dR#{UPx9$ge3pd-6-MLX5G5rcu>KYcKLhGB;DO)Nq~xiU*jc!Om?m%Pd!D&99r} z_ml7XqJ*l9tvD$P{pgk~RwT)zfr*|Rob%=R`wPMs(TQ0cEhgW4k{;N2PysxWDViwR(3--$^h z3KlnZV%}!OCW&>7Sh6k9G_4s=Cmul<>Kp$EIgwwCk529!`DOj|Q8iFu8@$ptXW+R0 z*~R9KSckjHk&mj>kEnFr2Y}Y@@l>$c3J$POd@{1MvWO~rD6x`v{e%)ZJJ0`CZf#_d zQ~z~&8V~;#>v#2gy5W+P`Q`5|tWINOHs)}P({vndGb+_*K>Slc+5Gl(Fcqz-g#pwk zb47ASeBDzsfHT92U6IGR4X@$5v~AaSVdKd2F2*Yfsr-D2{!JBf1P!9_9$LS#x(%N3hj=W*N5@E$p{R!t-+j`J`thmuChgwFRcFEP3e!8L0u z(Rg0j9oDpEB2B$})}Bth(G?5WEu}ndI=}M9E5+oMs^)22y+H1MD3;jZ$s70%=jRhs z`6Kn9C|WF?;w_n0`%LMK-SGssQg8|p>oT~3wnIL!s^O;;S0;C;3F?*4Ua@D2wye|UT-ywRR?W9xwQ^Q^Ohz??sx)lBn8-0d`KBu|D6IC{4IMfHkAB0V zOE+Fj;dMEloz-#(f&NpwW3Fl?5{7eWYw2Ul)f9O%X#%l7rK~ypLDU9zG#i|9eiK)) zRKuD9Wc1Dm4@+=lFYuA)dWSl7bkQ;Sn^9M~5GGu3y=sC;`Lc-vX~aphz`#z0hEVcE ztE~CWhzlZWzexoyZO#w6Y5;$n1v?pW75m5kOnrj-+fUAD@|c0gQh$_R)h?$6nmuqO zFqDfPvhe?+n$*GJd;5O!(Qd-bpZ~Bin%9nRKV-`TQyG4y#(MITed&|-eVpvzcmMP+ zW`O+*EdH`7+uKC$4=kDhJ(Pd(0z+)Aky3nnObrOT z`1X*WmVY1-{SVmD{tI^O8vnyWu&5@9|Mf&a|B%(w)62=pKA;{Hp~9pwGlKk=L(!-G z-<(ZB0g2pNyJke8oYXS#^MBopf6*N12u05~WsQW|y$m-E%{YG@KU_a|uI0kH$Q<%d znEZdN4Tz8l|8eA>R`UKLKPjbx#!ugQiu&(KmF$dt*v)|Gqa{#^TB?2X=!7IyntYMm z*y3DGJRdbV68v%E=`sI=BrLiNp6}Kh$Z<%D2t-VP1h0us9Jz9UDiD1D(ex&O(j(cn zae;LBir+Ma0o)`=)XEMAQ46oL+gwy7i1364GcHiL>PXdxHScrn^&d6Z@}Tnx%ft(Q3u4gRK?-bXu;&UU^VG}2X@n|dA> z%4N>@)>KAx5D0DSW-lk386`F9FZk@MCX#*qE)27s!8!+bgnDBk55W94nVV9Wg=+_* zOg^f?@ns1r217Lek9p(b+0*f2W9Z=D+kUNaVCf`Hxr9Ylu){^5N_=|m!A_M)>+8RH z{GWfht6q#B)<}JIqB8hSVcHh9@m_v!_wb7jzor{aPPH6cNd4;q4b?GgR8DYHl~;~a zZA*oD2JP*E)0Wji=_f6SC&8biQuw&TG(9*Ey@D)_z{T}-4ml=}H=PihYuuqy9o;&b zPGWy9Y@b=NJ`%}YjzVJ+^tJeSPhI(B5z+%m`Vo%T(*n>he>t6lI)MHM!nGE3!FAXE ze$l4?JvbE*5)p1xDPxS#{T>lu@$CpVn8vO1y1;3N@bEzc+RF=PSfW^94Rh(3081C` zG-%MMid(fafAadt6yW*YO$A)H8c~Z0dX2^NQ~RgqgvitiU$9*ya$-k?Xk-^;1RSg$ z2`251Brv-#LQ+Z2=s3Yt`kT^fFNjKW;=vY7+60Lw9No5ec-KBM)(v*S{bjoqNgDL+ z*a(k*DugqZVwb`FDCR!6v^y#AR6cKT~8`2-Xe_|enlxN-vhsN99(&O0HM@9~$lM?tWcwUC z__dqaO-<7cIjo9g=~rnW}8Xt&hW{ z-t85x*ZpzgfhF$s_B!-~p4-QXx;{Gsg73A5LQ|3b<6&$|K|8h4}(f(%eTi-ruvx&SX0c5b}_2Cs4uB2~5l#wBxu{~c`<^Tvy zde8InG}q1n7hhIi)_JlGolF|@ZEI~EUN3-ZQ3?c<==DWQcT4Dswx8HE3B;<>SfYNV z3CB+;rihBVBg)Fr6Xo#u{c%eBWP@swM~Jxvap1Pycxw&uaee;?sI(+d9ZXr$t0VKX@#Z2kwaCY&1 z>gQf`Y@buc(sI)A#1clqQF4ZUPELLygrS7`B1<||9k;I?qv0yAtkZIGg+6z51}<9+ zi(cV-c+GiRLGxX@!lX>Bp-jI(*?@+lUL&l~vFOwcCrIu0%TC@;(Ohu?|4&4QQUI_x6ou8e*{^uYg1OfmeS}b;gA$od3o_2f71WLOC zQ%cmiLIWgFXT{p5UIqu}W$S|JpMkLY>hm?Ya7GiAO1|LNY1Q8_>VJR0y3sSuHg9WC z0CDJjh2xq%#nX>(pQ_dTb6{H-y;EZ>QZ1|`Hy`P-d%fvX6rJ(2`6(?WCH?2jy^k)_ z1MVi@FwhJoDLFC760;lhqCWk_hYh7)5k@s)O5Jwc$eIQ4wj;_eMw^v(_OY{!tXuBm z@u7%m6J7CJCJHfzkcuvvZkO_R|8UI=^H>nHEsczm@(W=g$)3Y;w5_mDHo)J&0a4ss zdf&E+ZnA&_9d4GHLp*ha(`febX2oovsv%7xt!Nl8(ORgC6}>r46^1#s;5Y45jB9WD zl!;P>Q768*eQ?3$LcB%KW2vRc_BD7Wg1B428)K0aD#|j)4~>VA<-&b12#oO_evd03 zbXDE!OBRI683-5pt|E6cFQ-@02bOpe^rNK2#J8H^)DUqBFAN3rIu}PbGX%*Jr7KXTbjH%NVLQ$_&j#KkuCtA1hGL`+CWGxG1Kp`&R@@QiSuQ53& zEb@n&o5T4jB`LL})iC|>G%h%}LGq|0SC8{kR7v1G%w2fx)D&dNO081Al!~NyP=bCj zAI6&mESNBtDaasdY(8bUX3DmVp~BIvdW{dQ?GWeGxE#WzD`kxt^n}aspvZ2)vhPwU ze2b(&#*W5_%;>|6?v1~#C}m{}rBw~ze@#wKHia{WtK$kcO8cxBhphrXypu9Q%K{1( zuAoXleila42yluX`aws+WJ9l5XaJ9mn=I6Q2p-Zkl(z**T(|!Dk5a%0y&|Cw5z4Vq z{M5N=_#kdFxu1&E9tlf+7|{Wf2ppi7S}okc;|@H9F`RfOU8lF5Q(;9OeOCtG97TA~ z8a>hi+$lQBoO#QmU4bgVSkjv3NsgoSTWs(gUr3yM>bD-`Cp55NJvi+_RMC|s$NOWS z>F!}8#lyORc~<7g;nZbX6?|(ueDOmERy}rg`dobxg=L@QWpYKTBQ7*~qTE0RWlr2G zZbBdxvb3}bqI~l)sw5fwRna`_8cRaw&;gUEP_Yi|GU))rkH4Cp+&%ZihTL?FkBu9> z2+NyGS?Ao$E&Vi%54VCG=C{mf(YPCKAg)JJrTI&;=e0WdQtZ?E;e#!6dMxw)iUHF{ z!&_K!gk*r$p;Qsz7QVA!Y3=tOy57#z>wrC^KPi5Vt%X%i5vw>-x&2`jdDrM}q#EB9 z{oS;{L92?lFaU|1*IB0$U`ucImYxPm^WUGl4tf*7zzqcjz8ll7i-^7JBpMs_8NM-? zu3g7*qrigluU3?CD8F%!P$1pR8qqtdz?kk%S&-_Cnah>44okIJ5TQY`FRdO&Vgf;# z`MJ_1G2_Q$ew6yYi`krXp|`N+w79f;sL*Yo>?{siHEViP;WiP%)G`1zA60P0@Ua8f zfP<=V)s$0X9GuBcuMfG}2DE5-Jno*r-h~RWUKyfCeL^I94Y(Zs-s>?XrQS!8z%LzN z-!CgSvuds3ND6q=K)4j4t7|1PBtQ z1iwE+ArByNK|bSC?eFeaQlR`XRVG{!;XIW6nSE_hx-!|x4@(?1j0kt_guhqQ0uOd= zpZfO~`#9+C`}{8g8FtwBXFr0rabhEV;anmmHwz>9IJ(67hlLS%wfM{X_%4yx5$V2} znmrd5PI_BV!P7kf1?06{U-XVH!36)IYr_8$SRlHFfdK?uVmX;k?Kttd#)4yS{^ME< z{_Y3FwGdtjc)Gc%mE#shJ`MO`{H21xcQ7ZCpFnD_CDOmbGZ2eYMh^;cfL>uy3%|J* z$m;3nWaZ}O{HkA3^cS}@w|_Nes5~N|JgVYd z7XLf5Zn5SY^0&kU-p&Y!f4?vB))54qKt+d+xJ&N)LPjzvI>&3U_{rp-QWqXGaZOVG zIcR@yzG{M6$)8U*r0G{MstS^XRm+|Fyn&b;uN;DY z5Rs$IF{7$Win%4uV|&CU*&$&;c-MbU+U?`xBUc*Q-gH<0=XtF9JB${H}UX z@11zzK%YX#Ehy)2G@bj2f4vU;5o?%PRGksh>JuUuE~Rd%M;}!vMJEd`RBs6+6i=te^#~3os{9-_%ufKi{t_ zW{p|Qt#`j2oep_c@j}t!HXgwp?({q%PW6rYsuSifRv5`(qMt|6H)lYo8P~_=f?e3LsSN6QQ3r%%rmM zThVu-cX%l;MW&iLssn`qYfqqFj5?0GWZXPoWCL63(oA}rz>(PYfoI#GQWm`kNp>!|(E!~7%v z!}y8#SPRpsT7fO0>}&;(1lUTJ0EZw%sS8KyG^IeFQ1LUtfQ9*8K`4L5r5TCG?kv48 zg6&U29+W@Ju7fxuP3f`dv)LYVri@|Sz&@*E`5hQVEjAk^dcGZlah(RGPPi8Z#U=xPn=Weis2-s~{vxq7Gn%!-^U{EQuSX4NsOe99@IGYKz2_OMFT80**&eN`Hl=OAacEjsT1O|j zX2}&Sv2tfWw}X?lfF}@{BddiVb0Vt%vbOwKLo^Wp()+u3*>u{+po|i%vbR8Wh?hP~ zFzcUl!(iEDD!qKwXDQNMoFMefTbw6UE)w9WP`<^cHt5}KlPBcs8@{KqRl;gx@to>4 zCZ6>*gvqs9$CS=Y9X6j|$6iu;`h_XaF>k}GjahbP`u!5A^eKofoi4c;`UO_Yy}lWY zof>;uKRSjUReg5P)tw8i(f`(A1eK=p6borJKE?oWJgW==M5jrjs;G_8JP;VSh6sN+ z@`JY)cKqo5lrHLf=OuP2O<^=!t*)yPvp1XQRy>70d0-yu6*?PIG#WpB(P?#>YkPU} zk=nugyw0H^=*AMLzWcLXHsp0RTekqOpaN?RNBT12BKKhI>u+KkRRhF>lUTk(xS^Hx zAZjTE8Q`kqyNb48gnhz zXZz!H@0-@Ahs{pE`9JOcIe*H_?BmOBiji1&tX??$4Bg6oGYoEvY`o9!haO(6`}4IDI}K64yga2VVrg1_{)^zdelXRK)jvD8`Pg~ccr~4bd7{G2ejf*8 zgJpKOE}b&`=|!RUMz1>G}Fh)5Mp2yAH*Z&bOK%~OPnn(u7L+rmi2?F zi;{zrc*>M9qgF^Bzk&rwnPB_Bo2-WKaC*#@^I@5yDWk#s8c5>sYN$@=v^eru<5^>6 zbbL{Kfs-wmrxG7BZ>La6bfA%bhIRVwb zLmgezh!Vy^DtqwxVW_t(Y*JSQNE>fNjiI9@)a!t%PaG{=9o0kGL;e6yh7<6cxBb_; z?1K5ZuT98(k>?(50uxiDV1uhuGE^wp_kA{E)v#WsFrTlDA-Ik~pJ0qMHySN`RVe3t`35 zt;A2%vQ#FF$TF}o*4~T3E?n6fNm%E2yIa#q91{N#>r zNOvuO-8*D%qyb`G|l)#pI(U`G3A z$sQoZY@rp?Y)hmpxd3x)@WDJNK5lrnt3X%J8#hbB5O;c?{mAe z9k~(8(4NyIpJ=)E5}T0=!1sD=ZTiyuxRp8N7=;x&0I)dreQY#Fr@I-7v}(&MYP#%= ztoBC2>26(=Gbk4mE6HJTS@)k?U{bl%%<9=LPunn&%u}&{rALcehZLKI8@cWD?#bD<|=}&Wr_0fHOsPoPF;!4k517Vw2(Z-R z6~YNx-B`IMJL&^gb9Oo~xW$cQa;k_K8xI3hw#n+97}S;(Dzq{?hUABZK-p*-Bs`$7P_UUY!bEa)_(qaJy`-4ZaDA< z|H$5m25NyoC77D{Hg%I2w?64GN-KD<>Tb;G1RDT?r{g5f;si%KzY*G34+%4) zp+gu?Z;ZuKtybXUE`4ClW^8&DW!kU|5;uU0XN1&*PZAj<+NuBOPa#}Q*mc=E-C8<;_Ik;y%NvM#x z{l6Sc#_n~4SMqL)ZQQs~hnw5_gaRDEdlAmn*Ll12+0xh+IhfxB8TyOaMOLEtstgDv}0O&uG;;O;_~<6iZ#ebged*6yTzcpU=Ur zjUQY2?k~wdSY8tVeGR8e-)+QqgOOg_cg!V-)91B#-$^xSYV=oPgAdG7@w<-B(#Y*R zDv(kazw40b=WT^YPx4N$7|zN1AFRytQ$T}iL(<>ct#zFW($ez#Y%F&Ou(taT)F+H8 z!0efSS(p6`6Th6<<#sQQEN>D9G1d?=b!ZDj-&cF}#^#e?%&1=i=`ljhwoAzUJq{vG z-QLQqkNuI`cH;SyR-%)ti@NujGpNqI3c^Hf9+yYcF~_#+5d@IeBeL+$0sjq-djKW z9G2z%8NML=r-7_)o;JU<+a+E?yx!pcljJA(Ty#42$8IM2e@kftZBYO1X;&m@1}S5` zymUDEMhL!s7awH#kC;xTIqVQ5c!ZlC9UaZrb~rWzP=#!&%>9q3maqJjP4mM&ks>9y zqHpl3DAl_ysJ)TIpBcQ5oou8QBqk;#d}r}dVPD?!>ADK8e!+eF;1vHL;HOJXNoOw_ zY0(Y*%bfpsRPj;aH%ZKB&JC8$pa5~jzb%RUJRRt+4+k}g{2b%jQy%RzZk2XAvpQe( zo~KiTerr-WD!z+Of`f7mOSTK13)v)J&WxOojo?3Z$N9U;J+H#wu5s>ua1Or`9L^oU z@Ao@jRKc(I4gR?qWCJ(hK75_$JP=oXN6Eaa`pyNl9j<~!yPUeeC(5a*3qVrZ`t*tU zH>z^N{BcdUXIVpQES%()#wD|kz)5xWB9A(fxX*bDwSF~c;LxzfD{vXwshVU9ZcS_W4&bG>Weu2n}N3XFvrH_ zZOK_ie!gUx)m!bAZ7d=hsQQo0FSXP^yZ6u5vcJJg2bC{{x@MmptAZ|LPMx#?fj3IT$~=wJ)8Xbot0eox$8+i zR(M;BE_clH{Bu!7g}r#eSjX$WNT2cihzNbl?G9o5mrF>u3B~CY;Bl$!jOyEE3p}NW z+oV*9n7sOD(6y7B$?%0fg`y9%udBW71E*@>3jmeYdxnbnSJwb#51b7h(X z#x$H{^3-xan~GG#If^!cfwt{6*B=K{aI;%6k_9SwduWHj7ADhHzrV#u-y3W|rqB+p zdt=CQVS8rgP!43PMXxm!Jv?`Aj_O1V>#9L{MvIn&Lx9%|>*iWqHRM$B@y#c>8{g}B z(aHbHx@mW(rMUlL9X@Y^><`6P4pK#%_W{PGjubX@6y0(NNT>+;i zMe_B(>O+rzJY45&+hD2*zJJImELyjQf3so!s#C)LKu2ngkG-_T=l^<>`7-T)yDZ!+ z7@mIgGOu2BF@k7V{on?48Mw6c_PES^iT)y6gU^3Vh&rSH{=NXJBXvdaaU98T$=?O! z*>+8zX+Zlzcm8D>l-!TvcbStBU}tOPJv;OKWDmg6LiIrSwee?)`ypo&@Ze+HlDIIDqCB3NlAX)xu!5?HVyo8le2OEq^vCx0pG`Ywp-Oy&mcW3 zk8Qi};nN%Dx>NME1OF5Gp(YOYE_Kr2n};vfxzE}iT<@-HH)q%-W%_4bUWRX4_P(Ai zrpV{lj{;EmMj0Z7g9Y>Nfk3IbI%a4zswA>*SG(GWTtD}ZOlVp8+?G3e27CLA(Q#*e z-`ijL`4z|er|Dlqq$aX)u)$II{Feg+QIHdNyFYH;Q(JQR{bz5=&4r9-MzLF)ht!a_ zyUg)u0TZT5(E&_8Ya2^zw|kb*krYLSaUjI@F`u0(TO*DxW^5uKn}Po}X+AyTGfD(Q z-YF{5gU@f(>ighneK`@bjIp66kN9T;@N(C{kVA`tT_%H0YuiJj&h#i7TCfrvRH)vs z_p|1Rwz+;0oZ#eT{_?{2w)SZ`Qr-Br!mJ>slgIzm@3tW|dy-)lBVHvP*~Rc`FmeGi zdfkK6&C_YeJ$LitHS=&fr=<}|u7Z^s()#><{9x5RXWf5ebZ_(z8;fx^-UEJ@l^5$( zz2^_9{h7Mb8i3E;;CU+E8<3XX*wSt9Jrb<>M`$)d*KKJK&3rb75f=tZa9^wN`?%5) ztuX>f%;3B6ypQP)HKgvl{X4TUG#qkKvdE^A&-xOr<x-j1ulAk zxl{!er=_+vkV5%-q=*$~-GVVIMQIo|H7-nBPm?^Mww4JCBivBon5zt;J7Qq#$_9fW zJ*tZ;I2w*9a%#E3qDTfcbW)H=q0|&TNCqfTWC5W@cVM?Np;h)nq?nRJg~KOVNC$Yr z_M;B3XblSXTabwIf&?jQkYwK^!!Bz0h+toDL7tg8Mmo#RzyvNzEJ>9jtr(}9Yx)n8 z8H+m^da!oqtTooK^oCmt`gDU;XUrgNDMU-dWC4mTU%thQb`wz1u!`R~UD-y|3Q=5> zT9Bx90;WtVR=kvcnqeG^WaIGCaLF4@9ob(vE3E=lY?r=UreYc(kXsqpq==FvIGAMr z1hVtgiS7S9I~~Esf(vh`97l;9cj1a|6l<=gQG|go{KC%3MxIJ_1p|>IL2Ouu)0GiI zL>@@L8sdh{)^EaS;5I6su0YIKXft-Xrcg7*AQe0iu9+lOmREo&D8E>%5un32 zzZgWGAjwfVmxrR9k{bV$l~#-}Uiq+?(S$3reqo-Qct_FE#n3=IREJ1KYO&xFO1*BY`jq3x1LyMxuX~j~*P+$$-=`ST zvdLIQ39nuD7^(36zPEUPvXrV?c4bXjKo5}M*+m||>05KO%*11Mh~rCf(Q$9kKC9qJ z$FNQg*3a$dZ;*XjfM$#j_*gVq~{L);3T4Q3pCEBFOnRi-iCjR_UNl{P*Y}*yp zR3*+W%~aJxxa(WImbfbr+Li|Cb-G0IwbiPT3n>{L1|8mVy*GP2IYw+ZTDhG9v!t|l zO2Wg1YUX#gWgV-~3W>(H!tgpbIGNM>*`V|-!Mm;ty`IDe+{}okqWrS26K9VzqI69nO5GDwjPtnWspt@_&r?3-zT15qi~RFr=y4 zp>uJEYi4;nR+9$HauoOeOyPU5#OEDipm^kBo@E0mG!N$nARKChn*SGj@BA3q^Kbpe zn%K$2wrx9;iEZ1~#1q@b#I}uz?MXVe?L7U#Ip62rbN+*Scm2}o-P~QNz3W|Tz1B(n zH}Z-q>nPH=b4~If{vhD8SCb_+UfT9e(RJ-5+38`ywll58X|ZW`2qC^cx+AvkM$ig- zsJCQT8m?qzWuq%RU9X~7mDWTNoERz-FAt_4YUtw0WQfX9Wm4tfLyAG93)HkFYhbnb zTXmMVZ-GC$g7MJK2R^&Ci%FDFQM#)PPkLv!or4Y4g3@)nOg9%teQ-f&KXFGw9f)Lx z&HDZ8UIAVUj8tMRd5|kwk;YJCK!Eht46j7r-5${Syva^8Oo_~vLWcE7Sh7LK1{Nx` z+DvD~gUHb`QJf$VMv1J^?kpRWmYx;X7dld6Za{mgh2W8c7CtE4BP%>G*%y~_UuD$v zrL4f;88Swz(7{*xt6K#*j!S)A>BCYpGZ*ThgQ85*uAKk@cTcTJ{dxlfnjLJ65Na2% z+MoW3qo=tTUZ41TN5|hG;&Nm+@0a!DiJ%?RhV*1XpovPu#Ega4z2ME!xRJt?Mh;wb zp}c3`yg0#E_n<|kh)dkl$WSH{p&^Sg%Q8L?{;?^okk(F1WgJz^u0J?Hqz*K zIfmhEQQCBMs?%~DEttTUXwyNyOk5P`ND2=(TW{|er!`|%sblmDO>Wl&Buah`oX8l7 zDh%uCCD_Yi?`gzlQC_cST)4u7FB&50;`G|VlVf`>)f)R8)@9=`-QVH#HGh$sn_)52 zgrGLH79`w^f_cu=^^sTBuh4-hA8jlts~@Jh9PF^zjoUC;l3CR@kTUckN7X&IH(s?~f;=p|56w%${kRTS}B5)N^dFPWZ@*;QpqsE<@ zvf}eH;L22bPRH!?0{i~6iu@yYV6ZC*Jdj)-|6(S5&2hpW^DE z)86gtG}?&}7NS354{mfRqqh^K!YvZkd@iWGsS$+r*aAESnRgfHCgmz;#mj2-g@>YI z`i9C8YG*wKr^Bd+9@sj!@r{_Dp6nu{Tyl&Thcgb>f(Fq;6e1ZDs z>q|QQCC7-Z9sPX4qV#`XR)0JEbh#n?*d5jXSZty8f7Vy{*kM%oxMA#`{7n5k@2c>3 zywU%>Sy%4W?^1v0c^?|}_o>N$e9DtI!yk5S+UJVzO!?4Ng3M(+{F43aV{5rNEdKlO zF0ULJV|S)s{5P!kkEnI!7_zB(K$}Z+ptrMVlOmjYZV+R_sIPw>s;rJrBg_^T?x>e9 zG*A$G6X|k7h09-=Q_QF|I`Dh(`c?cSs{|FY$6pXzK>k;?E>Dd3t)BkySH3a?^`;z) zJ0d*lFw$g;v$yjtyb%)ani_bex#L}_R&4lOvL59{O_JLD8M3U+N3>6|tda!E@WEF! zchu-4k$7w3cjV)zgW;UjcEXsT`38?pY#248Yis8h%AHqTkK9`mSIk~?klw8B$rOPI ziC&XrQf7w|d~uSYnR`tS=-&=GGN8SEO|q%SCyS@y{$4_buH`MKVPK_t<->2=75?z| zZZ+h7Sz3PIPrP2(t=Rn^@49x~cR&4JUKehBh?=cFS{9dLdM2;lCtL+IMw`%o5>EeR zSr+W4NG(fk+Z%m(sq=kg*%j=1Uu+|GA-E^drW-N4W$rwTs^nYVuJF?w_b+zV5epny zT2mcdaXjs>lkiWe(HYbkk(ex_b&H2kuUf1K9!>1=n$`#GzH+43Q|mRwcs{=M$|8yq zbZFVDSxn%{4jpc&90O+@1K%Aa3lX^Z95GJCcYlfzu~M@cmN3>^vX3u*b!rm-#Y)}8 z?0!W?pm1ihw$Lu$^$R)bN9ITG?w>jAN>s(u`DK>uCTuuJIf@FU4)ZkzRje8-kcBc7 zc*R^KRsUpfT%=cyavYAmwIoI-wejx`xUak;^c1hsw$BaB%b~?MDCWp``eeJa^ryvI zEyT)@c-=oS@M_F`;s+m^Rn2Lh|NIWfS4Ed5Rkg3NH~Zt}p??UBhegrO%cuYLeyI=8 z6RF>s;!o|fP_zniJ2d2jZAWg_;84|?LbWk~+g)?J=y-5*IW@cYnmDckeyLM0`_KBx zS_Fwo)Ek>Jwk`yDQe%sd1qd%+^eZ0W5SC}LLy&OdsbJ%<{PVI8>GaVv*%X9eTF{#DT02fHeu{<-1DV&ru-Uw6n`RnUy-d;#J)aUa*w<9fr zmeei-AtDDWS>C5S`gZ@!;@DX6r-fukTVcs`TVc6HVYaNcTQ?SU1`J5`+H+_p@c@cR zPu<$0B^(lekZ^QSL$$|Aq4P5^eKCj=#_B~kal_Z9;itObNY7q6Zyc#2%Y*WgxVG-x zh^|_Bh*36oNNYj!&RckSXs2)OGDZ0UTR9u&3bpU-YJw)zH*S>7 zRtp_(^x)|9+CQ~4N;pV?fo8=AE~h-v#T`Y;t8Hd^U&}1?!O} zzB=C;PAkA{B>8XdR;6mBHFu=GUndkb83-!aEk_nVJ@IlzNR`So#x7E@(D}fUM}!gL z2dp~66FuNW54s%pVXU8}n51R|mFwWuAFZIXYk+K7|m@<&kiHWzRH>6m;J=fPQ- zk$-^Sfq6r#y_Fi?&>Av0B#JKMk{u4Bz&G*||GiazWdc;>k>=BJ=(|#tgQ~xJ6U0K@ zSqkF#Brj@lU3>nqml@qF{4IoVKK%y)0Lw^$H^#8hbLrixedTZM1Hr|2Z~Ok-scVe1(5X!ohqR)X6Zg2wHZ1n)T^<5^&d^g8C6-HPPv^V{*8ZRa5`8q(FPDx^+;38p#|Ye5vP5U`hc!u@OO2Wp;e z24r?>Z0v|LY6m&Zj1WLLdB@VSg1#(UAeKJhbFt^o=gHD7;N#_VeKL~S9OP_^Dv{Kp zfB_4FBfa_dn2~@}(3T)QQ_q!$uVl+{-tx?c-KgR0$F9{xes*{0!L=t8lcGaL9nRX< zbppPNG;F;YoaP%pfP;6BjM*1!j9A=IxBJryUtb4!%I#Q>p(tR2VfVpO`gMqXx8Kd% z{oMfcWb1Pq)+FgyT-sU^TpQE?l1{HV5wmjV{8G>`>@*RygOQ$>olSc|f1lIS5&y^7 z7HK+B;*@Wi2wm?m72Q^eL{Kx36Td-{%O`{96cbzRL5i1G5WA*^y0_UgkXQCB*=iR6 zoJBrZw z!5hsDgzy2$Q?#bjlZBj1Eq!yan7mgmsO(h5#n)Pk2jVTBgTn$82?{Hn0)e#})=-ABu=m4CIn)YB?12^t+w%jMzZE8ZM40s~HaQbhK~E1H(CkSFPrn{I$LN$$6a|9RaIslzg#2jGtqcVEP14iYzp8I_7s%HY3tf`{H`SWh*|mb}(op=4-op60@nTIO2bWZl5Tkv*D6 z>y|`wauXp$R#bKULtdtqD}08E7`$YEcGfx`q?G%Z{n*l?Q>${A_`6+XdeFe7&E;Ct z*fUC6lvKg|9tD9n&cHg9d>)m7fdbkGeG^ERQ2md({P1ija333)F;k^7r`*|Its$|u zMd7IxPDqO)siOF}E0H?xX3JkB$TT4_L1Na+j}QDEMto)k_AU-Kp5yJ%&Evc>#CV~I zJXz8Tc|4NGY%80N%%yb!+uM#sn#LODKzjbSR7J$h;2LKbwon19CK5_B43d|pJ5(R5 z#i|s#KG<5z;1q=cR+TbcUOTf4VG7jao8ZYPY&`XAjN8bf-%~Nj9sS0#M44~Kf0J({ zSN8Zm>c6+rB{RqlDT9ArU4C54b$e?->wo21BPQa{@c6|``*B{}cbN5X+}MhlOJm(hlY(8C%+w&>NOowkpF5v0ru{^O!q z3`CSiSLMSl@4TU5$=HrwV^m|)?frR7hqa}SR%>Vc)`>3L0kfcYvgh;HIC>6CgFsY= zr#`PnaeVC}U^wreZOfO0%8c^%ThRf{%wI>$(6S!jcN?FoE1p*FEb~gdfg}{Dh4=NRH zQC^DzcZ1E!rfoAr;PAU>oRe0vn$%ym835fh9}_@+`OvI8aq7Ks`*d9qie(#%3k6T3 zylI13Cn*495) zt+>#mM7$p$`@?Pvax>=kH9A`Vr~b{tu;_AqSoi#?vOd#Ohi(O`G0NR&IWi z9kvA|Thmsc@KO10mEN$4MxJ)6)t z9iVMp=ja31WW37qMZ>pB7g*Zw^4MHj!%4b_gD^j{8{dS2bXcQxq{5X zMH4<;t$00(4jak159di1lOUWbE2cxDEOt1yDuSUtL4-WSClEOi=M2FDWiQ%Lmp}7c zgO6EOL(T+_Av0mpB=K47>0}I!{Ht`Xr054iqFQBK-SeI*8$n%Tr;M7Dhf|8s$Ucjd z4n`Pd5!0d$K_pFmIRY4s?AW&B3Mz%&WaSdej0bh9jWLs6cw7cn`Jos0ec^PZ7ibt0kI2JaMyi64J_J z7w>OPHg*CJI9K{HVFoDN=?V zv134onnqq`c;}<`^J@Ux`zk;pIfuR;Y-3-EVE1i=26Z5oKSnjYOdasU3g!{~?kwy2*? zioDpvdbL6Dw^~8yt>SO;C}?Ko2L=Ir@e8GWw>s9pl7Xmy$iJwiFPyr!&!P;E*pdAG z+kdMPh=8($bYM~Bhx`)c`@dH9V?a=~%_S5N<@Jw$9hK}qevo_6%+AhEK3?7$yliwN z#79}^SMh({AOEqk1M$Nlj~1-Y6xyB*{{PmMWDjU+?i#5R`BkXjAEbYp9i; zn~LU0r_Me=Vyq$8JG?^O8`YP6b5!}_SNh@g0?nvPsw^QeuOw9?AQ^)SE?uLfK1~7W233is6adFi!s^SVXYf#tUBHuNsona?|#2|Nw&hbY9)!t zh=HdDxGFFp#iqqWb_~AQHjO4trdyU#ja&wAod8~Vb4^rr)L_%-7pRYI4(sRcNuPMx#xJ z_S?9Yy`e^<=86|D%PYt+XtB-CSu=a~`@xYFvK85FvQ%+W*~WJIoFbWS6vou1?t4T0 zA3=DEFYz{(%lNfz#vgZmufl5FopSrM-xMr-*AHP1SoZA&zYEIk^Q8;IkipH$F((PO z`Q7v1B;QJrbhKf?`LnIRn#fYlst~7Dw~Cg%gk1#f(U|9Zc+ICv5vqjoXbW72p{;kj zJk+jPaK*FQa!>O5>E95g&~gPmKaPXlBsWNr*fzGw#~2VfKLJaCdPO&;VKsiFy2Wr9 zuX;pj71fK!{j=4SsMNl%+*OIZT#l4)N`xAFZp^Ad%o?& zlFE7S%K7K$v7$4VH6KlZPNMbcrRJ%)(?j=kEd9A}9h}q3>5&u{$Le>H*6e=thRjGe7-@dlEq zf?%?Fht&sYG4*jxpoGl|azaB5lUXxBuTvimhl{nmDAv4QFPo+!T-rZk9tethPu6Vg zeIN^QO~LxG0G&QBUT?1IfWm4>jLhdP%@KS19)RRv0bC+Q%Y}pH{Hg7s(A4u? zsk%|Ci*uaglU!TN^QS|`%p*8nE627b=K^Dc2We5P3}ZMmg@^GlsTD8@i@)6T!?sl} z4mq6{G6ykJt}GX)Q`E7|fhfO348t5Wh#2TGlCe>K*Svp*B4s%8jSQzR(M z1^^G|OF8dDp>ZO($U;Hyr!#f^PK(Q2kDE&HsqfcZmDSzhOF8K&>ipmiOD}G5avHBM zhNsI&Yq($ADVbT?)*2%Q-5(VIzH72unZAA4s4-7Bev-1&e^51>aeiycAGBRxm*_f+ zL<)M}nYoYfFtM%9vChAgx0px#Ml1JPYwz~DYVR`NTdj~zFP7+|-rDc(ylQD4x{-+|>6x(C4NGQ6%l$tf={R6GPsp)B0c><=Y|0({3UuY~3e>qP2G%j5rFd?^lcJvB0$6%TPmd)FzCk!1FVl9spC| zKDKYb?=h0Mhk=KKoDhum{sUP}xuwzk_~HQZZgLncKx0Oz1Z8GNiS{}awAqq|kEy-( zGM2lxzI$}{Nv3fr9#MHIpesUW08Y-bcG79hyu>_XO;TH{!_U75X>tRs!GN>6hHm#s z0syUcVv{nho*3M0vMp3L%i`hG<%kwrGF4rF5(auYc==xqT>GP{vl$UceNQ=dx!#oCn~pXg-u5Q zq-~#N_tz)0bxRcMhE;7{%Uy@EB4jw6oiQK%nZ$0DWvp7l$IB2&Jb@lL#GFAV(YJT^ z9EAYpv&f(vEz|RUsWl~0r%<6e+&&^_!;!^em}ErkTN2X(7q1)I1qOaC&4}d;cLs?Q zOPa&VT4ZqRfN_S7oN5L4c~Q)8f!SIm4w$wCvc<+Q%8@wmgGb(06z#JI z@cJjv;^VrMPi;zbi8HftafA`|GQ(F;lI-44q*!2=&tTM4i}y~rJ@Vbo-&(^9h;NVK zXW3nHQBq=tn?TuR6|Ct6q0LHQachf>Ipk~4*;0^@GH%%oes zLVITjk?g{I&RDM*&Po?Ni(SZH|TOc^RVsaYv6u@iQo*S z0@|qT-jZpZ#}Z?eOE|6WT;fQjmF@rKL-OYEY_m+__v@;~qF+>p%hr)W)k5G{_HZA8 z(Ibq0(&MwCw5I=^oIZVVf5R3tEUBO;KeJ$Vcmh^w8_F~DVr7y3=cxdJd|RM(BM{>z zxBEzM+wxvZbRe>sJs`iP&>d=0IrBlHy*=l?YMZ&#{G63!vUszxt5$@$gVar3irhfJ z2G_j2vLoI%b|9djOxO<&>bfzv_Uk5~;j4E0;j;VgYRlyds_*xjY4$G@m#P z=h<)ZKa})n5ml{ef#-Teb!7di3b@cHe0)&;r_xBFrr%3l<*N#RdOi&-v#K=9<#ANe z$+II?N5Mz8C>XY`(cg?Yt;1k)A#0ce<9-CxpRP2QQ3C+8%=JIEODDZ;ntxC+*?ISC zBQAS<{zlKBZt*H?6TMm?&O_0LPPI^K;B1Z!C6zc_7USUs<9IAWV9-J;k~!>Wzk^R` z!Jzx`#QJ(XI-AbkO`TK&jQOe_=Y=-J&QTlOZ*rS*XnLsY+g5*%)LDGlIXl}zb+t0{ z^T3=`T}zUAr_nTOe1+Gtl|{mnRbSV+*5GMshshQD{siW^e%c+5kwU8Dk`^7LtO2Gz zeIQjdtQ*NnvR}s=hB;%?M4FUxv-+MW>k$wjTj++!z&y0pmOg|-H*LU)gz#+wO+{%D zO13n$=CYcOA*Mh5>*l*_vWrasRg3tEGKhmllyL)g%4Rx$CtGPzP+}xiOz5=9Jv_sY zCKoHOZeNG^3bu)9`Y1XBNplqA28$dkWtw^9G`OnCLgnAy5^*pQUgL>Bi;aF`>|N0@ zp-Fp>FkLAsy!93=%TI4R=#XZXpqJZbZbHQNVPl7puD0_tZRt$)qT?~LG5uc1zc!^& zU>1zT);F}|oJ^d*b=H9N@K~EEAECf30iyY-XtBm6Mh+Zo@FV*y?J~2p=YyRo-R56* zNK$^?cb+b^fMlXul|n6MuiAE3=F)BVvK@8G@25TEFfPXW7Qa z6J%qFEx8Ve$C+4%=jrmr6U~ELDxCnuu2m=2wrhSh=IMfh8ZpLxdD_nOVCy%kH^dgm zA?sB}j~7|Q4xA1C-kT|0NuQ^ICji)rvUDjfbA<4*gAK(%JyOEUkuJH8{uq#Z{$sQ8 zt6t3J7fujya@bHI@0)R(lIz~xx%Yi6sTtRQG(=>lEmk%8)8k;wVBVy(epOueI@;FM4z* z&22y_JuuHHK+PyTScOJxR@Eq8tZ`eZ3G7b?Bi_+a)I^5n!+sqPIebW2m+R>6@J0G7cN0Vb(`G(wxKBq`4RN!t4 zcXgR!XrXf0dnVr+$d4W$?_#z+haI}T1k>&$Ce4WIKev}%zJ)b(RJE9c)wq!*?B@>A zX1mbPE7^B@8){P$Akp_9P^3VvZ`%XJRLgX1)|oP$rx9w0q*DyoyEa<`UtOWsR7 z2Bv>62Fv-?D?y(`H~1LazbeD0zj`n6Akr&Xy;*Z0L)j-~HIH#iF-Bzb%MCon-2OQc zm-HJc@V+sBn2_QLDOT zZEqMb_&N~CV(bhF?(skLfD2Un-|BA%{Nqjl`b~fpk@zK`J3%SmANg-i_;m>o@(r3f zp|)8n+WX6o#Ue)5_J{@iouBBR>Hz}bvg_Z~3mzU+E(MYh&Q;NWOBY;!?STM8N-8NS z32`FN;D;%ZA^vwC-Oyi53m}Q&AN2~Xk}l97@)sO~Op5bF;;+~1{PABB7#=~vp8Br8 zR4@>xEWdmu78)^iDaGLb70(#_3p_WdN|u4dS}IW(1A_j94jSK-l@Y-IQNJks&2S9mc`2*VreM{x6+r9f?dnYWt4t_`;nL{fXk( zi148IyKBM^J})I1m50QzUzf}JHLQx%CVpGYEoWDrf%`sPP~T~QG{CIR+-=dUq{QU@ zS8ie2<6Wh9HfJ3#_cz};Nl4^HXddkfR=?U@FjH&ld#@9p^)GSfwVN(DATd4qs!TX; z<_Y12b4_;&LRGVm9Vr3~#l3GIj+dxP$(^hOuxI90_>4ht%95OjTZH3;%aC#B8%3R* zH~S~=YPm~^UT>V6;!R8ba@tK?HIyIHrC|_HQ`ryF9@@9}cbAIR??~3|TIaE)Z(1Nt z^Y*cTNn`eR+Z?3ZU7j0(%a(hF{rCCDGX3(8H%Ej;nx357;y@z&ySt6+j=R{~UFQ$s zH`?+pAV=lz_?|X@M>j7=H+U{VZ0CaYz~Z~(?dzfA(IM%hUU&bm-APV_S-FAm`}1!} zU*_?h(SXN8KvpUP}qBYel~*A!}Lvz zHyg)tRpnNW-vwJYj9+0JV%{6kno+`wDy|pS%hj}N@(GAzoB7&@-Oc6}=d&ux%2I7N zViw^KbR&sGYEJ?VesBk9S9v+aB}SG`q7@-1Ae(?3v*6w=e>!y_(XZTTWajid-FFdO zr%-Bj!@+V9TF|CCbK9ruw*gddqM**jKZUoUcoHLzv5~Yb`V#8-lbyO z<;P1g)UvC5spzT$qPl2?uvg<-1eomake4V=AdYvSh2Q*Ey!It_ovW!;PRVW% z5m<#?4jHh*LcM=F#ZVKa*_eThyFK?=Y`qy>?IqLo<-&x{>w8xKK>R72 zK}B+_{L7N<~K1QrU_Y;gw%1>hGR z7VQFE2+o9*ZwX{XiLfY9!Y(Qo)DMDyTyFw2*+E4vutoSL+55Yek;QDWu5U9&Cs!vY z9SE35kWvtyLL@&sGkVOe6I;CzmRq?&3gAZuO_F9NiB5f3pzgVeZo z>(nDXtF%Zc&LoCmj z&3MP`&yPBwB+RaMT*%EE>?e$=i}`u=$AZv2!6;NavA};-pR}!={`gS4tPmr%W2P>y zz43a_+ig;;vh%E{T5hh|0{=L_HtfT?Wrm>*%yzLAD)%TPo&M%+8#zc(U!V%c7~kDs$h{T?Sc1;iZNmnF=9KpiI3!Kit&4`Bgxg*wEb$+oevH z6h0j-KUO%a;;O81^UGMhP^+f4Ii;H)${Nf9J!u1J|J|3g;o1wn3G&T0r(y(l=KTd1 zF$VAr2fO7G9-*+)HXBs(`L-?@eO@Jxw$few!OUmPo6JUyGwFM!dMC1bRj_ot>SUqU z{D9ULm^!U}*?ngDHLKJ6Qt@QS zVC!mThQyB+cdLG;tD!VS-4?)SXL&|oZDIFZZYXB5;p*L@rSIxKnb@eUt)_3l*(q5Z z{}M*&=YL3^MRIj{SoQVBkW1e1F@X0gh?dKm>aIg$?}1b{`g2rMJbBdEE?`~l5q?_P zga#OH^apnyvsO;7?>pb*OR<%KOOdICoo6&%gDq6VYo5LsiCKD|t4Tv%^Ms<_Z@p8z zbTkdTJioFZ0`;{tZmrqgq4{;srab;OZgwuPJ^1&)K)d|1=i%ip0G|~QRO7KZ^H%Dc zV86Ms!R~esAHYCWrLFDP!`~{IpV$mjNqxl4lNjU>%RmBi;Wsm(JeQp z@=w&^?9Gxlu3^=tqoXy*ishS_ntGy2uR3HNs;jB3maohTQ#E!)4d;ok4IT%G3_}sa za^jms7MQyb3~>g+xi{bM7AD@ZNgrK#cN}EM&xwiTC=DxO4{1@Si|2n4lj4gfM`I+a zbwLE+%8sf;gbY2G9miuj)Zn!2TOG5c6tP%_%N=mRM+)s8;U@BCmsV4ZJlnPeO>IvO z9Gb^*Ig_RHZ>XQ_vtFr=9!%v-_od2?uF2oVz(#88X_1no8FlM)25O10tjG;eXgGr# zmT1uQ%|p8IgphEehFgH?_s?jaLP4!GXIiRcP^Zk=9vy7Unt+B`uQu7(6JZ{xUyH#j zkj6!%sH=?{VQ4m8#Jmil3giUhhtkt2x4A6giklY1)rlect6E%zWZ@y=3~v=kb<$6B zBuleF?Bs=Kcgdp?OwMULqNjLHPwiAv|1pdlfC!pY=9*9~6K=>Cc82f@LuqbTi#}m$ zFq|ETa~Wv1OD0)yx+Foqg~xF>2q>SkX4dGW0U6FeL*%YYQ-zn5$=^EU_6l?NhDD@| z+{fli$ZHybqwW$GU}n87aF3`0RNEH!;cKk8X;7FSa(`X#VD4GXmzZ^V=zZ9un=pv$ z`zd43CM3c*uUe1~d5~jmZ5U#6@1fW*&z21uY8>LM$V@0$KMe7h#)xCEg%vL%`Z?3M zW@lRa^VY<2gJM4UY$?UeAvs1b{XB%Y44!49m6sJ-{c?>WrOvIx&P9GFvVHp&#v7{g z*DnJKp+m{>!dR2loQa@-lP zm&t9V@&!*$GR0qz9(dQi?>YQVAx1k7)9~?7Jp0eP3Ws%p^5R8=Lk3jlAt>2-wlRI` zx+~`a?CQzGNcC!ehrh3aQ8P`7zD4o_qr{w(S@?1P(C4U%B&+PTw)&&nyXKLcvb( z-}_&0?H@i8d`=4b+;5qV06s6L{hceW$Gs8s`MkQ?B|hH9y?eTr@9sHc2@v6ZKh}9C z=YvfL`!^_~^*6n4e6ZUv!l_K|D5o=fIv;O1b2pxId;GW}^IaeBHvLwvo;jzxy_m^1 zbO~{A+g)F`0dMnFfDJzmadbDuWuI(2l1xPT{3)3lQ9hsl#~Go3KPctgddEvo_vg)cm@Rhq@V0BO0U9vk!^iFQ zS@7d_*QS*8Hh$P_8T)Os0qNe}S=XT5g z{UsByX+>t;vTzy^GgV!4+4XexCC;PAKlxOuh>PoqC8Q^@lBa9k7Ra}jrHgT~WyAz> zK2i=Y1*~4)zU>kP8X-VYNaCr`8}7Q&0$u$y7>Jc zrvYy-vJN~o&MTgHW4FW0`T+Z<4RiNykGTkzA;y|slTe)n<5w|$?JA4p5tQqmSo~CB!Ywh)I$E3l4kqeiZxw*jW z+XwKoZ(5(}D`PKlHjxel>2LUctX3V$lm29f^35wbCH&Z*ssVmfo`~*aOF!hsR-m-T87to%0h4gtdS<~ak9FlKsGYt83cK*uP z?X|!WWb7>7d5{_n0M_FBwiJM0HK5WT( z+wJ+&1rVU!yjh8g*jH`rJ@HvCv!@;*r$G=U!L(cit5Pjboew4n8*guIgdh!nAQ7O5 z<&EskqsF7j9Z$JBBH>P-9BhD8!9@twB6VsNX-b(gqR*GM#;fc2K9)4^)Z}A^!`@NL z1);6_TDUsj>1ht$A|Zxq>A`{@GSmV;MQlNrB2l>VeIOniJw!VGw}}KjSlGy{rx;5% zX-ZX{m>flR@gD;xO`Rq`oXCOMHoSeWy(^*w*e`=`(p*rYhTlU_@eJE+Z4k!|9Fn1` zgxOo7gy(Tgs-?QCO^+uzMh;NHx_=DA%k^T8+R$V($?he1%Ee27OA@70!Q(~JGTS2` zDRsDqP32cYS8yCV*ed?ih;d9DME6L9t&#v@u>%W~!gb=mGxV0xhfX3Sh_%;QYY8P* z40tr!ud;okuVhjMCXlqBuWAqN>}jhF-i)z?1en5r?TfH|jhAV)h)4113`Z{ z3$*$J{?K;nUP;H8Fj)VLL6^=*_5}j0p|BhA2W5U&-WOSl0_-SmJdY(E!fXh?;7jbB zC91Y)+r;1O!*JoojTV&gBB|2>{S6$x0(d^s?Yk02YRJ}ikarnjbQ`M!RR&fHK-i%QOb1KDpz5tfnqlQ{oY;whRD|luS?V;osx(8Icjjpp zA6H6n5gM-dl)iXR^njVUHF~F#at<6<`hM7U*JlXbZ@&^|@IKhU3XvcvBqWn_n2wCO z(DX9&h2prKEA|ld9qeq(8q5;6-`U{14FF0CXe!&j(|Ze@lf|vBHTdFYjL2M5N&ZGA zc%vrGZb+pMc)NwWGGT-(CS>*RH=3s;@w`33Es&kgtW0b{^YhPMNyL%`DJ{Fwg#l}v z3S!lC8@Bk%r)0ilo>bfT`s7fwuU-5D>*-s6@bCr<_B;ZLM3)lT7t6}mt(deU~mgsf9g^|xWmZF#Xtc>t_9D{Oc-ecr_{v|}DTqnaci2|sVK7*o0Gh4#-Qn{shR zo!orAm3wxjRP=H6dtS^bRHwKC^|bdSH;4s8#h8y_F3!n%8`kb+kv}Q8smYy)(;?3Y zy4{bp$3~4r4A*1`bY(wp9f4LPn16Hq{FndrF6l&DeJ-(pXWf((zNlId|V-LISd zQ>#+={g*=qX~pE1QeW8p@%*JPFUUW2C9J`KBg4=oY?O}oA zsJ974hJmRqoM|VaOy+kgZts9$QioH{+YLRyzNo+q(DF56MsPs$U{I zzs${Itp+m9$XE3&2Wbt}%>sl2yzz~!s@4QD%FNOyMJY$q2|%L=UAxGnv&=_V4|6)T zD|XX%Cax!+ciAQjN)9XEHIryeXz!d$rRh=0VU( z6}X~Sx{uOP?Min?HaMXv%qgVG&jt3y(Vs2*vLmJz`A4^4$k7&Bc@L<3EpNw+iaiAz z7fG0jU7mj#GE47`R{9J|Ih*vMd=Y zTXFzt{4sX~fxGLIaxe;C=)MAxwo8`Dv)Ucq;4 zU!C3wiV0H0FYE|31EBm>)PM$yW0S9j(i(!zP?p}6n&IRmFO2i?vEdCI1myD*9OVDm zSMlp!M3g{5Ksli^Z@~%rvI9)$ zLjcGg(a{Fom#|5kHAIzABt!_>2z%nTjX-&&1dELpPGERs`i`;p)cb}r!>C$rJ)%Ib zM!ssyj%F~}cRA<$W^ON<4>Ae?SM!$O^y{8c#$9jDZn7jCIE=j>KlrGt z!G&AghybNwnSx;z%H|l#uBL(Qe|g91lc>cH;Tb>^b)U%4YPoi=fw($-CuA)V=qagT zrvoQ=$}=f-RmqvpTz86&Ad9H!w;+&^#?enOkv$XXxjmE`&@k zA=CZ#Q&K2?J8?wG2iTYXXGaX6E--lq?m2@40ipb7&~$LJv~w|aQZ{vQ`FrgAfBntO zU}R}`rZ&w8E{y)+mfY-zi4cQ`ipNHdaj1)HTTgF^hQg^>02{xxMfL3)$+w-e9tU?f z2UJPPWdcn=re#O7C0iNl;QGWxrlk+jB=# zMaDaNf>>tg$!s{V(}rhGa@m=0nADT7^vCLE)Xv6UdE!UPv_wGA`U--eT|3phnb68_;kSUUw=4zYE@DsSpLR9fYf3 zsxgZuW!SNpRVzN;f6*GUW5cE(v9j{VDy+2X>cL8Ei%Py1<8bt_np(a>V2sgVTi*MaCk@f+dZ;+YJs4QJ^MHnD9< z8`oW>n~Jgx6B3oU%9*40IVdCd6pCOa_+nR2c79bc+8;^U8Y1_^PiIl0I0%MXrOKdQ zakzSuMyiEnX=$Z>h#Fxuy|-y8kgMl(;;D~(U*BCP5##q$C(9-U&k<4XbLuP;p`^UC(pEnh^yQbf};RYfEqtG3gNNQCG2fjQ? zmp5tscI~BfzJ34lCHJw}Blq2+WR??Wu~zA#mI^cbZnx}+R%cJwAO4>-)5PbZg2ft< zHEBb3-rfzCA^^UYd|B1>I4AlwPXT`E^h^#!;+kP)x&1w+Z=z}Ar!Gm)Y(urvwo$h; zvR!)K+)1ED9hT)~m^I&2bXSE{-lvsw8Uzn-;su}mxKn-o!*l?CI#cBysnr$rLq^Lp z2rggVjk@%dLDd4(K-B}(gZ^h*{_(%Gz~%qh0+#=03tIlCecq0Z$NIe@{BQrGpMG^T zRlp;x3OxSE|M$tl(81yVKUe(c{Fs&4XSdD-A9@M?f*5!a{l|qWR7g#+2;XaECeP7Z z-Gm2)MmBU1do;(~z8>qVZDGtj0o0kqO^Kgx0hys97)Dj`bFCQp z<&^=i1`q5W=(ltoC=Nnb z>Zf&?b4;aPetEUr)No0FVzq@tL6DED=ap=O-x(ioRQd$(G`n?hl3B>qGR`FyqED1x zL=>``j6r78UD48&C)zrQp`fuhXHpmsslfTAV%~#!G z(kfFpe-)R_hO77XEAqZRZ20S=zySbJwn!sn;dWAF-^JVPOWLP4c0aWLy4N72lpw)DO57HbuoTc1^Ne4;W9GmG9daX)3ju5W&=ZE8?e9>Mx z%}vz@lVDTOBke`dHv2vv1_l{d^pNLNME4>hw9rjCJ?o(QC7>zWfLTKX=syHFs|z-z zI3uwrH6^$N*aA&QN&&#=1_MO~i^?TVVWLb7AdH%KE?R+2$W2YjOw`ZJO-xTU)GNqK zM|T4HAOXS&5dlmnL5m!y=%%1{-w2O=og70#zWx3Jiwb3SPFp> Qs4#;DD+9wnpjHM302QnT^#A|> diff --git a/src/AasxRestServerLibrary/GrapevineLoggerConsumers.cs b/src/AasxRestServerLibrary/GrapevineLoggerConsumers.cs deleted file mode 100644 index 6bc4d4423..000000000 --- a/src/AasxRestServerLibrary/GrapevineLoggerConsumers.cs +++ /dev/null @@ -1,123 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo AG & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Grapevine.Interfaces.Shared; - -/* -Please notice: -The API and REST routes implemented in this version of the source code are not specified and standardised by the -specification Details of the Administration Shell. The hereby stated approach is solely the opinion of its author(s). -*/ - -namespace AasxRestServerLibrary -{ - public class GrapevineLoggerSuper : IGrapevineLogger - { - // IGrapevineLogger side - - private LogLevel level = LogLevel.Trace; - - public LogLevel Level { get { return level; } set { level = value; } } - - public void Debug(object obj) { if (this.level >= LogLevel.Debug) this.Append("DBG: {0}", obj); } - public void Debug(string message) { if (this.level >= LogLevel.Debug) this.Append("DBG: {0}", message); } - public void Debug(string message, Exception ex) - { - if (this.level >= LogLevel.Debug) - this.Append("DBG: Exception when {0}: {1}", message, ex.ToString()); - } - public void Error(string message, Exception ex) - { - if (this.level >= LogLevel.Error) - this.Append("ERR: Exception when {0}: {1}", message, ex.ToString()); - } - public void Error(string message) { if (this.level >= LogLevel.Error) this.Append("ERR: {0}", message); } - public void Error(object obj) { if (this.level >= LogLevel.Error) this.Append("ERR: {0}", obj); } - public void Fatal(string message) { if (this.level >= LogLevel.Fatal) this.Append("FTL: {0}", message); } - public void Fatal(object obj) { if (this.level >= LogLevel.Fatal) this.Append("FTL: {0}", obj); } - public void Fatal(string message, Exception ex) - { - if (this.level >= LogLevel.Fatal) - this.Append("FTL: Exception when {0}: {1}", message, ex.ToString()); - } - public void Info(string message, Exception ex) - { - if (this.level >= LogLevel.Info) this.Append("INF: Exception when {0}: {1}", message, ex.ToString()); - } - public void Info(string message) - { - if (this.level >= LogLevel.Info) this.Append("INF: {0}", message); - } - public void Info(object obj) { if (this.level >= LogLevel.Info) this.Append("INF: {0}", obj); } - public void Log(LogEvent evt) { if (this.level >= evt.Level) this.Append("{0}", evt.Message); } - public void Trace(string message, Exception ex) - { - if (this.level >= LogLevel.Debug) this.Append("TRC: Exception when {0}: {1}", message, ex.ToString()); - } - public void Trace(string message) { if (this.level >= LogLevel.Trace) this.Append("TRC: {0}", message); } - public void Trace(object obj) { if (this.level >= LogLevel.Trace) this.Append("TRC: {0}", obj); } - public void Warn(string message) { if (this.level >= LogLevel.Warn) this.Append("WRN: {0}", message); } - public void Warn(string message, Exception ex) - { - if (this.level >= LogLevel.Warn) this.Append("WRN: Exception when {0}: {1}", message, ex.ToString()); - } - public void Warn(object obj) { if (this.level >= LogLevel.Warn) this.Append("WRN: {0}", obj); } - - // Consumer side - - public virtual void Append(string msg, params object[] args) - { - } - - } - - public class GrapevineLoggerToConsole : GrapevineLoggerSuper - { - public override void Append(string msg, params object[] args) - { - Console.Error.WriteLine(msg, args); - Console.Error.Flush(); - } - } - - public class GrapevineLoggerToListOfStrings : GrapevineLoggerSuper - { - private List list = new List(); - - public override void Append(string msg, params object[] args) - { - lock (list) - { - list.Add(string.Format(msg, args)); - } - } - - public string Pop() - { - if (list == null) - return null; - - lock (list) - { - if (list.Count < 1) - return null; - - var res = list[0]; - list.RemoveAt(0); - return res; - } - } - } - -} diff --git a/src/AasxRestServerLibrary/LICENSE.txt b/src/AasxRestServerLibrary/LICENSE.txt deleted file mode 100644 index 75f36a4ff..000000000 --- a/src/AasxRestServerLibrary/LICENSE.txt +++ /dev/null @@ -1,1475 +0,0 @@ -Copyright (c) 2018-2023 Festo AG & Co. KG -, -author: Michael Hoffmeister - -Copyright (c) 2019-2021 PHOENIX CONTACT GmbH & Co. KG -, -author: Andreas Orzelski - -Copyright (c) 2019-2020 Fraunhofer IOSB-INA Lemgo, - eine rechtlich nicht selbstaendige Einrichtung der Fraunhofer-Gesellschaft - zur Foerderung der angewandten Forschung e.V. - -Copyright (c) 2020 Schneider Electric Automation GmbH -, -author: Marco Mendes - -Copyright (c) 2020 SICK AG - -Copyright (c) 2021 KEB Automation KG - -Copyright (c) 2021 Lenze SE -author: Jonas Grote, Denis Göllner, Sebastian Bischof - -The AASX Package Explorer is licensed under the Apache License 2.0 -(Apache-2.0, see below). - -The AASX Package Explorer is a sample application for demonstration of the -features of the Asset Administration Shell. -The implementation uses the concepts of the document "Details of the Asset -Administration Shell" published on www.plattform-i40.de which is licensed -under Creative Commons CC BY-ND 3.0 DE. - -When using eCl@ss or IEC CDD data, please check the corresponding license -conditions. - -------------------------------------------------------------------------------- - -The components below are used in AASX Package Explorer. -The related licenses are listed for information purposes only. -Some licenses may only apply to their related plugins. - -The browser functionality is licensed under the cefSharp license (see below). - -The Newtonsoft.JSON serialization is licensed under the MIT License -(MIT, see below). - -The QR code generation is licensed under the MIT license (MIT, see below). - -The Zxing.Net Dot Matrix Code (DMC) generation is licensed under -the Apache License 2.0 (Apache-2.0, see below). - -The Grapevine REST server framework is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The AutomationML.Engine is licensed under the MIT license (MIT, see below). - -The MQTT server and client is licensed under the MIT license (MIT, see below). - -The ClosedXML Excel reader/writer is licensed under the MIT license (MIT, -see below). - -The CountryFlag WPF control is licensed under the Code Project Open License -(CPOL, see below). - -The DocumentFormat.OpenXml SDK is licensed under the MIT license (MIT, -see below). - -The ExcelNumberFormat number parser is licensed under the MIT license (MIT, -see below). - -The FastMember reflection access is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The IdentityModel OpenID client is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The jose-jwt object signing and encryption is licensed under the -MIT license (MIT, see below). - -The ExcelDataReader is licensed under the MIT license (MIT, see below). - -Portions copyright (c) by OPC Foundation, Inc. and licensed under the -Reciprocal Community License (RCL, see below) - -The OPC UA Example Code of OPC UA Standard is licensed under the MIT license -(MIT, see below). - -The MSAGL (Microsoft Automatic Graph Layout) is licensed under the MIT license -(MIT, see below) - -Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license -(MIT, see below). - -The Magick.NET library is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed -under Apache License 2.0 (Apache-2.0, see below). - -------------------------------------------------------------------------------- - - -With respect to AASX Package Explorer -===================================== - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to cefSharp -======================== - -(https://raw.githubusercontent.com/cefsharp/CefSharp/master/LICENSE) - -Copyright © The CefSharp Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - * Neither the name of Google Inc. nor the name Chromium Embedded - Framework nor the name CefSharp nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -With respect to Newtonsoft.Json -=============================== - -(https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md) - -The MIT License (MIT) - -Copyright (c) 2007 James Newton-King - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to QRcoder -======================= - -(https://github.com/codebude/QRCoder/blob/master/LICENSE.txt) - -The MIT License (MIT) - -Copyright (c) 2013-2018 Raffael Herrmann - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to ZXing.Net -========================= -With respect to Grapevine -========================= -With respect to FastMember -========================== -With respect to IdentityModel -============================= - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to AutomationML.Engine -=================================== - -(https://raw.githubusercontent.com/AutomationML/AMLEngine2.1/master/license.txt) - -The MIT License (MIT) - -Copyright 2017 AutomationML e.V. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - -With respect to MQTTnet -======================= - -(https://github.com/chkr1011/MQTTnet/blob/master/LICENSE) - -MIT License - -MQTTnet Copyright (c) 2016-2019 Christian Kratky - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to ClosedXML -========================= - -(https://github.com/ClosedXML/ClosedXML/blob/develop/LICENSE) - -MIT License - -Copyright (c) 2016 ClosedXML - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to CountryFlag -=========================== - -(https://www.codeproject.com/Articles/190722/WPF-CountryFlag-Control) - -The Code Project Open License (CPOL) 1.02 - -Copyright © 2017 Meshack Musundi - -Preamble - -This License governs Your use of the Work. This License is intended to allow -developers to use the Source Code and Executable Files provided as part of -the Work in any application in any form. - -The main points subject to the terms of the License are: - - Source Code and Executable Files can be used in commercial applications; - Source Code and Executable Files can be redistributed; and - Source Code can be modified to create derivative works. - No claim of suitability, guarantee, or any warranty whatsoever is provided. - The software is provided "as-is". - The Article(s) accompanying the Work may not be distributed or republished - without the Author's consent - -This License is entered between You, the individual or other entity reading or -otherwise making use of the Work licensed pursuant to this License and the -individual or other entity which offers the Work under the terms of this -License ("Author"). - -License - -THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS -CODE PROJECT OPEN LICENSE ("LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT -AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED -UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. - -BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HEREIN, YOU ACCEPT AND AGREE -TO BE BOUND BY THE TERMS OF THIS LICENSE. THE AUTHOR GRANTS YOU THE RIGHTS -CONTAINED HEREIN IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND -CONDITIONS. IF YOU DO NOT AGREE TO ACCEPT AND BE BOUND BY THE TERMS OF THIS -LICENSE, YOU CANNOT MAKE ANY USE OF THE WORK. - -Definitions. - "Articles" means, collectively, all articles written by Author which -describes how the Source Code and Executable Files for the Work may -be used by a user. - "Author" means the individual or entity that offers the Work under -the terms of this License. - "Derivative Work" means a work based upon the Work or upon the Work -and other pre-existing works. - "Executable Files" refer to the executables, binary files, -configuration and any required data files included in the Work. - "Publisher" means the provider of the website, magazine, CD-ROM, -DVD or other medium from or by which the Work is obtained by You. - "Source Code" refers to the collection of source code and -configuration files used to create the Executable Files. - "Standard Version" refers to such a Work if it has not been modified, -or has been modified in accordance with the consent of the Author, -such consent being in the full discretion of the Author. - "Work" refers to the collection of files distributed by the Publisher, -including the Source Code, Executable Files, binaries, data files, -documentation, whitepapers and the Articles. - "You" is you, an individual or entity wishing to use the Work and -exercise your rights under this License. - -Fair Use/Fair Use Rights. Nothing in this License is intended to reduce, -limit, or restrict any rights arising from fair use, fair dealing, -first sale or other limitations on the exclusive rights of the -copyright owner under copyright law or other applicable laws. - -License Grant. Subject to the terms and conditions of this License, the -Author hereby grants You a worldwide, royalty-free, non-exclusive, -perpetual (for the duration of the applicable copyright) license -to exercise the rights in the Work as stated below: - You may use the standard version of the Source Code or Executable -Files in Your own applications. - You may apply bug fixes, portability fixes and other modifications -obtained from the Public Domain or from the Author. A Work modified -in such a way shall still be considered the standard version and will -be subject to this License. - You may otherwise modify Your copy of this Work (excluding the Articles) -in any way to create a Derivative Work, provided that You insert a prominent -notice in each changed file stating how, when and where You changed that file. - You may distribute the standard version of the Executable Files and Source -Code or Derivative Work in aggregate with other (possibly commercial) -programs as part of a larger (possibly commercial) software distribution. - The Articles discussing the Work published in any form by the author may -not be distributed or republished without the Author's consent. The author -retains copyright to any such Articles. You may use the Executable Files and -Source Code pursuant to this License but you may not repost or republish or -otherwise distribute or make available the Articles, without the prior written -consent of the Author. - -Any subroutines or modules supplied by You and linked into the Source Code -or Executable Files of this Work shall not be considered part of this Work -and will not be subject to the terms of this License. - -Patent License. Subject to the terms and conditions of this License, each -Author hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, -royalty-free, irrevocable (except as stated in this section) patent license -to make, have made, use, import, and otherwise transfer the Work. - -Restrictions. The license granted in Section 3 above is expressly made subject -to and limited by the following restrictions: - You agree not to remove any of the original copyright, patent, trademark, -and attribution notices and associated disclaimers that may appear in the -Source Code or Executable Files. - You agree not to advertise or in any way imply that this Work is a product -of Your own. - The name of the Author may not be used to endorse or promote products -derived from the Work without the prior written consent of the Author. - You agree not to sell, lease, or rent any part of the Work. This does -not restrict you from including the Work or any part of the Work inside -a larger software distribution that itself is being sold. The Work by itself, -though, cannot be sold, leased or rented. - You may distribute the Executable Files and Source Code only under the terms -of this License, and You must include a copy of, or the Uniform Resource -Identifier for, this License with every copy of the Executable Files or -Source Code You distribute and ensure that anyone receiving such Executable -Files and Source Code agrees that the terms of this License apply to such -Executable Files and/or Source Code. You may not offer or impose any terms -on the Work that alter or restrict the terms of this License or the -recipients' exercise of the rights granted hereunder. You may not sublicense -the Work. You must keep intact all notices that refer to this License and to -the disclaimer of warranties. You may not distribute the Executable Files or -Source Code with any technological measures that control access or use of the -Work in a manner inconsistent with the terms of this License. - You agree not to use the Work for illegal, immoral or improper -purposes, or on pages containing illegal, immoral or improper material. -The Work is subject to applicable export laws. You agree to comply with all -such laws and regulations that may apply to the Work after Your receipt of -the Work. - -Representations, Warranties and Disclaimer. THIS WORK IS PROVIDED "AS IS", -"WHERE IS" AND "AS AVAILABLE", WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OR -CONDITIONS OR GUARANTEES. YOU, THE USER, ASSUME ALL RISK IN ITS USE, -INCLUDING COPYRIGHT INFRINGEMENT, PATENT INFRINGEMENT, SUITABILITY, ETC. -AUTHOR EXPRESSLY DISCLAIMS ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES -OR CONDITIONS, INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS -OF MERCHANTABILITY, MERCHANTABLE QUALITY OR FITNESS FOR A PARTICULAR -PURPOSE, OR ANY WARRANTY OF TITLE OR NON-INFRINGEMENT, OR THAT THE WORK -(OR ANY PORTION THEREOF) IS CORRECT, USEFUL, BUG-FREE OR FREE OF VIRUSES. -YOU MUST PASS THIS DISCLAIMER ON WHENEVER YOU DISTRIBUTE THE WORK OR DERIVATIVE -WORKS. - -Indemnity. You agree to defend, indemnify and hold harmless the Author and the -Publisher from and against any claims, suits, losses, damages, liabilities, -costs, and expenses (including reasonable legal or attorneys’ fees) -resulting from or relating to any use of the Work by You. - -Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, -IN NO EVENT WILL THE AUTHOR OR THE PUBLISHER BE LIABLE TO YOU ON ANY LEGAL -THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY -DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK OR OTHERWISE, -EVEN IF THE AUTHOR OR THE PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY -OF SUCH DAMAGES. - -Termination. - This License and the rights granted hereunder will terminate -automatically upon any breach by You of any term of this License. -Individuals or entities who have received Derivative Works from You under -this License, however, will not have their licenses terminated provided such -individuals or entities remain in full compliance with those licenses. -Sections 1, 2, 6, 7, 8, 9, 10 and 11 will survive any termination of -this License. - If You bring a copyright, trademark, patent or any other infringement -claim against any contributor over infringements You claim are made by the -Work, your License from such contributor to the Work ends automatically. - Subject to the above terms and conditions, this License is perpetual -(for the duration of the applicable copyright in the Work). -Notwithstanding the above, the Author reserves the right to release the Work -under different license terms or to stop distributing the Work at any time; -provided, however that any such election will not serve to withdraw this -License (or any other license that has been, or is required to be, -granted under the terms of this License), and this License will continue -in full force and effect unless terminated as stated above. - -Publisher. The parties hereby confirm that the Publisher shall not, under -any circumstances, be responsible for and shall not have any liability -in respect of the subject matter of this License. The Publisher makes no -warranty whatsoever in connection with the Work and shall not be liable -to You or any party on any legal theory for any damages whatsoever, including -without limitation any general, special, incidental or consequential damages -arising in connection to this license. The Publisher reserves the right to -cease making the Work available to You at any time without notice - -Miscellaneous - This License shall be governed by the laws of the location of the head -office of the Author or if the Author is an individual, the laws of -location of the principal place of residence of the Author. - If any provision of this License is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of the -remainder of the terms of this License, and without further action by the -parties to this License, such provision shall be reformed to the minimum -extent necessary to make such provision valid and enforceable. - No term or provision of this License shall be deemed waived and no -breach consented to unless such waiver or consent shall be in writing -and signed by the party to be charged with such waiver or consent. - This License constitutes the entire agreement between the parties -with respect to the Work licensed herein. There are no understandings, -agreements or representations with respect to the Work not specified herein. -The Author shall not be bound by any additional provisions that may appear -in any communication from You. This License may not be modified without -the mutual written agreement of the Author and You. - - -With respect to DocumentFormat.OpenXml -====================================== - -(https://github.com/OfficeDev/Open-XML-SDK/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to ExcelNumberFormat -================================= - -(https://github.com/andersnm/ExcelNumberFormat/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2017 andersnm - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to jose-jwt -======================== - -(https://github.com/dvsekhvalnov/jose-jwt/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014-2019 dvsekhvalnov - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With resepect to ExcelDataReader -================================ - -(https://github.com/ExcelDataReader/ExcelDataReader/blob/develop/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014 ExcelDataReader - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepect to OPC UA Example Code -==================================== - - * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved. - * - * OPC Foundation MIT License 1.00 - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * The complete license agreement can be found here: - * http://opcfoundation.org/License/MIT/1.00/ - - -With respect to OPC Foundation -============================== - -RCL License -Reciprocal Community License 1.00 (RCL1.00) -Version 1.00, June 24, 2009 -Copyright (C) 2008,2009 OPC Foundation, Inc., All Rights Reserved. - -https://opcfoundation.org/license/rcl.html - -Remark: PHOENIX CONTACT GmbH & Co. KG and Festo SE & Co. KG are members -of OPC foundation. - -With respect to MSAGL (Microsoft Automatic Graph Layout) -======================================================== -(see: https://github.com/microsoft/automatic-graph-layout/blob/master/LICENSE) - -Microsoft Automatic Graph Layout, MSAGL - -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -""Software""), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With respect to Glob (https://www.nuget.org/packages/Glob/) -=========================================================== -(see: https://raw.githubusercontent.com/kthompson/glob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2013-2019 Kevin Thompson - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to Magick.NET -========================== - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -With respect to SSharp.NET library -================================== - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/src/AasxRestServerLibrary/Properties/AssemblyInfo.cs b/src/AasxRestServerLibrary/Properties/AssemblyInfo.cs deleted file mode 100644 index edad697fd..000000000 --- a/src/AasxRestServerLibrary/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die einer Assembly zugeordnet sind. -[assembly: AssemblyTitle("AasxRestServerLibrary")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("AasxRestServerLibrary")] -[assembly: AssemblyCopyright("Copyright © 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly -// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von -// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. -[assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird -[assembly: Guid("967e60e3-d668-42a3-aa0b-1a031c20d871")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, -// indem Sie "*" wie unten gezeigt eingeben: -//// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] From 445978238065a3e82837bd0951503288a70deef1 Mon Sep 17 00:00:00 2001 From: Alexander Wollbrink Date: Fri, 12 Jul 2024 11:50:12 +0200 Subject: [PATCH 09/13] remove WpfMtpControl --- .DS_Store | Bin 8196 -> 8196 bytes src/WpfMtpControl/AasOpcUaClient.cs | 325 ---- src/WpfMtpControl/CanvasClickObject.cs | 83 - .../DataSources/MtpDataSourceOpcUa.cs | 135 -- .../DynamicInstances/MtpDynamicInstance.cs | 1493 ----------------- .../DynamicInstances/MtpViewAnaMonTiny.xaml | 53 - .../MtpViewAnaMonTiny.xaml.cs | 34 - .../DynamicInstances/MtpViewAnaViewLarge.xaml | 74 - .../MtpViewAnaViewLarge.xaml.cs | 34 - .../DynamicInstances/MtpViewAnaViewTiny.xaml | 51 - .../MtpViewAnaViewTiny.xaml.cs | 34 - .../DynamicInstances/MtpViewBinDrive.xaml | 32 - .../DynamicInstances/MtpViewBinDrive.xaml.cs | 34 - .../DynamicInstances/MtpViewBinValve.xaml | 32 - .../DynamicInstances/MtpViewBinValve.xaml.cs | 34 - .../DynamicInstances/MtpViewBinViewLarge.xaml | 69 - .../MtpViewBinViewLarge.xaml.cs | 34 - .../DynamicInstances/MtpViewBinViewTiny.xaml | 48 - .../MtpViewBinViewTiny.xaml.cs | 34 - .../DynamicInstances/MtpViewPIDCntlTiny.xaml | 48 - .../MtpViewPIDCntlTiny.xaml.cs | 34 - src/WpfMtpControl/LICENSE.txt | 1475 ---------------- src/WpfMtpControl/MtpAmlHelper.cs | 285 ---- src/WpfMtpControl/MtpData.cs | 408 ----- src/WpfMtpControl/MtpDataSourceSubscriber.cs | 85 - src/WpfMtpControl/MtpSymbolLib.cs | 162 -- src/WpfMtpControl/MtpVisuOpcUaClient.cs | 312 ---- src/WpfMtpControl/MtpVisuOptions.cs | 77 - src/WpfMtpControl/MtpVisuViewer.xaml | 41 - src/WpfMtpControl/MtpVisuViewer.xaml.cs | 668 -------- src/WpfMtpControl/MtpVisualObjectLib.cs | 383 ----- src/WpfMtpControl/Properties/AssemblyInfo.cs | 55 - .../Properties/Resources.Designer.cs | 62 - src/WpfMtpControl/Properties/Resources.resx | 117 -- .../Properties/Settings.Designer.cs | 30 - .../Properties/Settings.settings | 7 - .../Resources/PNID_DIN_EN_ISO_10628.xaml | 268 --- src/WpfMtpControl/Resources/PNID_Festo.xaml | 533 ------ src/WpfMtpControl/UiElementHelper.cs | 497 ------ src/WpfMtpControl/WpfMtpControl.csproj | 22 - 40 files changed, 8202 deletions(-) delete mode 100644 src/WpfMtpControl/AasOpcUaClient.cs delete mode 100644 src/WpfMtpControl/CanvasClickObject.cs delete mode 100644 src/WpfMtpControl/DataSources/MtpDataSourceOpcUa.cs delete mode 100644 src/WpfMtpControl/DynamicInstances/MtpDynamicInstance.cs delete mode 100644 src/WpfMtpControl/DynamicInstances/MtpViewAnaMonTiny.xaml delete mode 100644 src/WpfMtpControl/DynamicInstances/MtpViewAnaMonTiny.xaml.cs delete mode 100644 src/WpfMtpControl/DynamicInstances/MtpViewAnaViewLarge.xaml delete mode 100644 src/WpfMtpControl/DynamicInstances/MtpViewAnaViewLarge.xaml.cs delete mode 100644 src/WpfMtpControl/DynamicInstances/MtpViewAnaViewTiny.xaml delete mode 100644 src/WpfMtpControl/DynamicInstances/MtpViewAnaViewTiny.xaml.cs delete mode 100644 src/WpfMtpControl/DynamicInstances/MtpViewBinDrive.xaml delete mode 100644 src/WpfMtpControl/DynamicInstances/MtpViewBinDrive.xaml.cs delete mode 100644 src/WpfMtpControl/DynamicInstances/MtpViewBinValve.xaml delete mode 100644 src/WpfMtpControl/DynamicInstances/MtpViewBinValve.xaml.cs delete mode 100644 src/WpfMtpControl/DynamicInstances/MtpViewBinViewLarge.xaml delete mode 100644 src/WpfMtpControl/DynamicInstances/MtpViewBinViewLarge.xaml.cs delete mode 100644 src/WpfMtpControl/DynamicInstances/MtpViewBinViewTiny.xaml delete mode 100644 src/WpfMtpControl/DynamicInstances/MtpViewBinViewTiny.xaml.cs delete mode 100644 src/WpfMtpControl/DynamicInstances/MtpViewPIDCntlTiny.xaml delete mode 100644 src/WpfMtpControl/DynamicInstances/MtpViewPIDCntlTiny.xaml.cs delete mode 100644 src/WpfMtpControl/LICENSE.txt delete mode 100644 src/WpfMtpControl/MtpAmlHelper.cs delete mode 100644 src/WpfMtpControl/MtpData.cs delete mode 100644 src/WpfMtpControl/MtpDataSourceSubscriber.cs delete mode 100644 src/WpfMtpControl/MtpSymbolLib.cs delete mode 100644 src/WpfMtpControl/MtpVisuOpcUaClient.cs delete mode 100644 src/WpfMtpControl/MtpVisuOptions.cs delete mode 100644 src/WpfMtpControl/MtpVisuViewer.xaml delete mode 100644 src/WpfMtpControl/MtpVisuViewer.xaml.cs delete mode 100644 src/WpfMtpControl/MtpVisualObjectLib.cs delete mode 100644 src/WpfMtpControl/Properties/AssemblyInfo.cs delete mode 100644 src/WpfMtpControl/Properties/Resources.Designer.cs delete mode 100644 src/WpfMtpControl/Properties/Resources.resx delete mode 100644 src/WpfMtpControl/Properties/Settings.Designer.cs delete mode 100644 src/WpfMtpControl/Properties/Settings.settings delete mode 100644 src/WpfMtpControl/Resources/PNID_DIN_EN_ISO_10628.xaml delete mode 100644 src/WpfMtpControl/Resources/PNID_Festo.xaml delete mode 100644 src/WpfMtpControl/UiElementHelper.cs delete mode 100644 src/WpfMtpControl/WpfMtpControl.csproj diff --git a/.DS_Store b/.DS_Store index 4681d72119b8a6dfc8cf209d38b326f189a6c819..a403536d20b13cfa9315f4778f5610689effc69a 100755 GIT binary patch delta 21 ccmZp1XmQvuO@PDL++0V&#Mo%_Jb^TR07^IpLjV8( delta 21 ccmZp1XmQvuO@PD9!c<4W#K?H_Jb^TR07_H_MF0Q* diff --git a/src/WpfMtpControl/AasOpcUaClient.cs b/src/WpfMtpControl/AasOpcUaClient.cs deleted file mode 100644 index 4eeb2a812..000000000 --- a/src/WpfMtpControl/AasOpcUaClient.cs +++ /dev/null @@ -1,325 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Opc.Ua; -using Opc.Ua.Client; -using Opc.Ua.Configuration; - -namespace WpfMtpControl -{ - public enum AasOpcUaClientStatus - { - Ok = 0, - ErrorCreateApplication = 0x11, - ErrorDiscoverEndpoints = 0x12, - ErrorCreateSession = 0x13, - ErrorBrowseNamespace = 0x14, - ErrorCreateSubscription = 0x15, - ErrorMonitoredItem = 0x16, - ErrorAddSubscription = 0x17, - ErrorRunning = 0x18, - ErrorReadConfigFile = 0x19, - ErrorNoKeepAlive = 0x30, - ErrorInvalidCommandLine = 0x100, - Running = 0x1000, - Quitting = 0x8000, - Quitted = 0x8001 - }; - - public class AasOpcUaClient - { - const int ReconnectPeriod = 10; - Session session; - SessionReconnectHandler reconnectHandler; - string endpointURL; - int clientRunTime = Timeout.Infinite; - static bool autoAccept = true; - static AasOpcUaClientStatus exitCode; - string userName; - string password; - - public AasOpcUaClient(string _endpointURL, bool _autoAccept, - int _stopTimeout, string _userName, string _password) - { - endpointURL = _endpointURL; - autoAccept = _autoAccept; - clientRunTime = _stopTimeout <= 0 ? Timeout.Infinite : _stopTimeout * 1000; - userName = _userName; - password = _password; - } - - private BackgroundWorker worker = null; - - public void Run() - { - // start server as a worker (will start in the background) - // ReSharper disable once LocalVariableHidesMember - var worker = new BackgroundWorker(); - worker.WorkerSupportsCancellation = true; - worker.DoWork += (s1, e1) => - { - try - { - while (true) - { - StartClientAsync().Wait(); - - // keep running - if (exitCode == AasOpcUaClientStatus.Running) - while (true) - Thread.Sleep(200); - - // restart - Thread.Sleep(200); - } - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); - } - }; - worker.RunWorkerCompleted += (s1, e1) => - { - ; - }; - worker.RunWorkerAsync(); - } - - public void Cancel() - { - if (worker != null && worker.IsBusy) - try - { - worker.CancelAsync(); - worker.Dispose(); - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); - } - } - - public void Close() - { - if (session == null) - return; - session.Close(1); - session = null; - } - - public AasOpcUaClientStatus StatusCode { get => exitCode; } - - public async Task StartClientAsync() - { - Console.WriteLine("1 - Create an Application Configuration."); - exitCode = AasOpcUaClientStatus.ErrorCreateApplication; - - ApplicationInstance application = new ApplicationInstance - { - ApplicationName = "UA Core Sample Client", - ApplicationType = ApplicationType.Client, - ConfigSectionName = Utils.IsRunningOnMono() ? "Opc.Ua.MonoSampleClient" : "Opc.Ua.SampleClient" - }; - - // load the application configuration. - ApplicationConfiguration config = null; - try - { - config = await application.LoadApplicationConfiguration(false); - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.Error(ex, "Error reading the config file"); - exitCode = AasOpcUaClientStatus.ErrorReadConfigFile; - return; - } - - // check the application certificate. - bool haveAppCertificate = await application.CheckApplicationInstanceCertificate(false, 0); - if (!haveAppCertificate) - { - throw new Exception("Application instance certificate invalid!"); - } - - // ReSharper disable HeuristicUnreachableCode - // ReSharper disable once ConditionIsAlwaysTrueOrFalse - if (haveAppCertificate) - { - config.ApplicationUri = X509Utils.GetApplicationUriFromCertificate( - config.SecurityConfiguration.ApplicationCertificate.Certificate); - - if (config.SecurityConfiguration.AutoAcceptUntrustedCertificates) - { - autoAccept = true; - } - // ReSharper disable once RedundantDelegateCreation - config.CertificateValidator.CertificateValidation += new CertificateValidationEventHandler( - CertificateValidator_CertificateValidation); - } - else - { - Console.WriteLine(" WARN: missing application certificate, using unsecure connection."); - } - // ReSharper enable HeuristicUnreachableCode - - Console.WriteLine("2 - Discover endpoints of {0}.", endpointURL); - exitCode = AasOpcUaClientStatus.ErrorDiscoverEndpoints; - // ReSharper disable once ConditionIsAlwaysTrueOrFalse - var selectedEndpoint = CoreClientUtils.SelectEndpoint(endpointURL, haveAppCertificate, 15000); - Console.WriteLine(" Selected endpoint uses: {0}", - selectedEndpoint.SecurityPolicyUri.Substring(selectedEndpoint.SecurityPolicyUri.LastIndexOf('#') + 1)); - - Console.WriteLine("3 - Create a session with OPC UA server."); - exitCode = AasOpcUaClientStatus.ErrorCreateSession; - var endpointConfiguration = EndpointConfiguration.Create(config); - var endpoint = new ConfiguredEndpoint(null, selectedEndpoint, endpointConfiguration); - - session = await Session.Create(config, endpoint, false, "OPC UA Console Client", 60000, - new UserIdentity(userName, password), null); - - // register keep alive handler - session.KeepAlive += Client_KeepAlive; - - // ok - exitCode = AasOpcUaClientStatus.Running; - } - - private void Client_KeepAlive(Session sender, KeepAliveEventArgs e) - { - if (e.Status != null && ServiceResult.IsNotGood(e.Status)) - { - Console.WriteLine("{0} {1}/{2}", e.Status, sender.OutstandingRequestCount, sender.DefunctRequestCount); - - if (reconnectHandler == null) - { - Console.WriteLine("--- RECONNECTING ---"); - reconnectHandler = new SessionReconnectHandler(); - reconnectHandler.BeginReconnect(sender, ReconnectPeriod * 1000, Client_ReconnectComplete); - } - } - } - - private void Client_ReconnectComplete(object sender, EventArgs e) - { - // ignore callbacks from discarded objects. - if (!Object.ReferenceEquals(sender, reconnectHandler)) - { - return; - } - - if (reconnectHandler != null) - { - session = reconnectHandler.Session; - reconnectHandler.Dispose(); - } - - reconnectHandler = null; - - Console.WriteLine("--- RECONNECTED ---"); - } - - private static void OnNotification(MonitoredItem item, MonitoredItemNotificationEventArgs e) - { - // ReSharper disable once UnusedVariable - foreach (var value in item.DequeueValues()) - { - //// Console.WriteLine("{0}: {1}, {2}, {3}", item.DisplayName, value.Value, - //// value.SourceTimestamp, value.StatusCode); - } - } - - private static void CertificateValidator_CertificateValidation( - CertificateValidator validator, CertificateValidationEventArgs e) - { - if (e.Error.StatusCode == StatusCodes.BadCertificateUntrusted) - { - e.Accept = autoAccept; - if (autoAccept) - { - Console.WriteLine("Accepted Certificate: {0}", e.Certificate.Subject); - } - else - { - Console.WriteLine("Rejected Certificate: {0}", e.Certificate.Subject); - } - } - } - - public NodeId CreateNodeId(string nodeName, int index) - { - return new NodeId(nodeName, (ushort)index); - } - - private Dictionary nsDict = null; - - public NodeId CreateNodeId(string nodeName, string ns) - { - if (session == null || session.NamespaceUris == null) - return null; - - // build up? - if (nsDict == null) - { - nsDict = new Dictionary(); - for (ushort i = 0; i < session.NamespaceUris.Count; i++) - nsDict.Add(session.NamespaceUris.GetString(i), i); - } - - // find? - if (nsDict == null || !nsDict.ContainsKey(ns)) - return null; - - return new NodeId(nodeName, nsDict[ns]); - } - - public string ReadSubmodelElementValueAsString(string nodeName, int index) - { - if (session == null) - return ""; - - NodeId node = new NodeId(nodeName, (ushort)index); - return (session.ReadValue(node).ToString()); - } - - public DataValue ReadNodeId(NodeId nid) - { - if (session == null || nid == null || !session.Connected) - return null; - return (session.ReadValue(nid)); - } - - public void SubscribeNodeIds(NodeId[] nids, MonitoredItemNotificationEventHandler handler, - int publishingInteral = 1000) - { - if (session == null || nids == null || !session.Connected || handler == null) - return; - - var subscription = new Subscription(session.DefaultSubscription) - { PublishingInterval = publishingInteral }; - - foreach (var nid in nids) - { - var mi = new MonitoredItem(subscription.DefaultItem); - mi.StartNodeId = nid; - mi.Notification += handler; - subscription.AddItem(mi); - } - - session.AddSubscription(subscription); - subscription.Create(); - } - } -} diff --git a/src/WpfMtpControl/CanvasClickObject.cs b/src/WpfMtpControl/CanvasClickObject.cs deleted file mode 100644 index 00a65c034..000000000 --- a/src/WpfMtpControl/CanvasClickObject.cs +++ /dev/null @@ -1,83 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace WpfMtpControl -{ - - public class CanvasClickObjectBase - { - public int Zlevel = 0; - public object Tag; - - public virtual double Area { get { return 0.0; } } - public virtual bool CheckClick(double x, double y) { return false; } - } - - // ReSharper disable once UnusedType.Global - public class CanvasClickObjectBox : CanvasClickObjectBase - { - public double X0, Y0, Width, Height; - public override double Area { get { return X0 * Y0; } } - public override bool CheckClick(double x, double y) - { - return (x >= X0 && x <= X0 + Width && y >= Y0 && y <= Y0 + Height); - } - - public CanvasClickObjectBox() { } - public CanvasClickObjectBox(double X0, double Y0, double Width, double Height, int Zlevel, object Tag) - { - this.X0 = X0; - this.Y0 = Y0; - this.Width = Width; - this.Height = Height; - this.Zlevel = Zlevel; - this.Tag = Tag; - } - } - - // ReSharper disable once UnusedType.Global - public class CanvasClickObjectList : List - { - private static int CompareCanvasClickObject(CanvasClickObjectBase x, CanvasClickObjectBase y) - { - if (x == null) - return +1; - if (y == null) - return -1; - if (x.Zlevel < y.Zlevel) - return +1; - if (x.Zlevel > y.Zlevel) - return -1; - if (x.Area < y.Area) - return -1; - if (x.Area > y.Area) - return +1; - return 0; - } - - public void FinalizeForUse() - { - this.Sort(CompareCanvasClickObject); - } - - public CanvasClickObjectBase FindClick(double x, double y) - { - foreach (var co in this) - if (co.CheckClick(x, y)) - return co; - return null; - } - } -} diff --git a/src/WpfMtpControl/DataSources/MtpDataSourceOpcUa.cs b/src/WpfMtpControl/DataSources/MtpDataSourceOpcUa.cs deleted file mode 100644 index 3672c4ef7..000000000 --- a/src/WpfMtpControl/DataSources/MtpDataSourceOpcUa.cs +++ /dev/null @@ -1,135 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using AasxIntegrationBase; - -namespace WpfMtpControl.DataSources -{ - /// - /// This class is expected to be sub-classed by a specufic OPC UA client implementation - /// - public class MtpDataSourceOpcUaServer - { - public string Endpoint = ""; - public string User = ""; - public string Password = ""; - } - - /// - /// This class is expected to be sub-classed by a specufic OPC UA client implementation - /// - public class MtpDataSourceOpcUaItem - { - public enum AccessType { Undefined, ReadOnly, WriteOnly, ReadWrite } - - public string Identifier = ""; - public string Namespace = ""; - public AccessType Access = AccessType.ReadWrite; - - public string MtpSourceItemId = ""; - } - - /// - /// This class holds information to manage renaming of endpoints for different MTP instances - /// - public class MtpDataSourceOpcUaEndpointMapping - { - public string NewEndpoint = null; - public string ForName = null; - public string ForId = null; - - public MtpDataSourceOpcUaEndpointMapping() { } - - public MtpDataSourceOpcUaEndpointMapping(string NewEndpoint, string ForName = null, string ForId = null) - { - this.ForName = ForName; - this.ForId = ForId; - this.NewEndpoint = NewEndpoint; - } - - public bool IsValid - { - get - { - return NewEndpoint.HasContent() - && (ForName.HasContent() || ForId.HasContent()); - } - } - } - - /// - /// This class allows for string replacement of information given on data sources - /// - public class MtpDataSourceStringReplacement - { - public string OldText = null; - public string NewText = null; - - public MtpDataSourceStringReplacement() { } - - public MtpDataSourceStringReplacement(string OldText, string NewText) - { - this.OldText = OldText; - this.NewText = NewText; - } - - public bool IsValid - { - get - { - return this.OldText.HasContent() && this.NewText.HasContent(); - } - } - - public string DoReplacement(string input) - { - if (input == null) - return null; - if (!this.IsValid) - return input; - return Regex.Replace(input, this.OldText, this.NewText); - } - } - - /// - /// This class holds information, which is to be used prior to load / setup MTP data acqusition. - /// - public class MtpDataSourceOpcUaPreLoadInfo - { - public List EndpointMapping = new List(); - public List IdentifierRenaming = new List(); - public List NamespaceRenaming = new List(); - } - - /// - /// This interface is expected from every OPC UA client to be implemented - /// - public interface IMtpDataSourceFactoryOpcUa - { - MtpDataSourceOpcUaServer CreateOrUseUaServer(string Endpoint, bool allowReUse = false); - MtpDataSourceOpcUaItem CreateOrUseItem(MtpDataSourceOpcUaServer server, - string Identifier, string Namespace, string Access, string mtpSourceItemId, bool allowReUse = false); - void Tick(int ms); - } - - /// - /// Interfaces for a graphical status display of a data source factory - /// - public interface IMtpDataSourceStatus - { - string GetStatus(); - void ViewDetails(); - } -} diff --git a/src/WpfMtpControl/DynamicInstances/MtpDynamicInstance.cs b/src/WpfMtpControl/DynamicInstances/MtpDynamicInstance.cs deleted file mode 100644 index 0fe95dc52..000000000 --- a/src/WpfMtpControl/DynamicInstances/MtpDynamicInstance.cs +++ /dev/null @@ -1,1493 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Media; -using System.Windows.Threading; -using AasxIntegrationBase; -using Aml.Engine.CAEX; -using WpfMtpControl; - -namespace Mtp.DynamicInstances -{ - // see: https://stackoverflow.com/questions/25522218/wpf-binding-not-updating-the-view - public abstract class ObservableObject : INotifyPropertyChanged - { - #region INotifyPropertyChanged Members - - /// - /// Raises the PropertyChange event for the property specified - /// - /// Property name to update. Is case-sensitive. - public virtual void RaisePropertyChanged(string propertyName) - { - OnPropertyChanged(propertyName); - } - - /// - /// Raised when a property on this object has a new value. - /// - public event PropertyChangedEventHandler PropertyChanged; - - /// - /// Raises this object's PropertyChanged event. - /// - /// The property that has a new value. - protected virtual void OnPropertyChanged(string propertyName) - { - - PropertyChangedEventHandler handler = this.PropertyChanged; - if (handler != null) - { - var e = new PropertyChangedEventArgs(propertyName); - handler(this, e); - } - } - - #endregion // INotifyPropertyChanged Members - } - - public class MtpDynamicInstanceBase : ObservableObject - { - // - // Important Members, Methods - // - - /// - /// An overloaded object might request drawing the MTP symbol on top of the dynamic instance. - /// - public bool DrawSymbolAsWell; - - /// - /// If MTP symbol is drawn, hold the Canvas object of it - /// - public FrameworkElement SymbolElement; - - /// - /// Called, if the state of the object has been changed or firstly initialized - /// - public virtual void RedrawSymbol(MtpVisuOptions visuOptions = null) - { - } - - /// - /// Internal flag for redrawing - /// - private bool doRedrawOnTick = false; - - /// - /// Flag for this instance to demand a redraw next time b ythe UI thread. - /// - /// - public void DemandRedrawOnTick() - { - this.doRedrawOnTick = true; - } - - /// - /// Will be called by the UI thread each 100ms - /// - public virtual void Tick(MtpVisuOptions visuOptions = null) - { - if (this.doRedrawOnTick) - { - this.doRedrawOnTick = false; - this.RedrawSymbol(visuOptions); - } - } - - public virtual void PopulateFromAml(string Name, InternalElementType ie, MtpDataSourceSubscriber subscriber) - { - } - - public virtual UserControl CreateVisualObject(double mtpWidth, double mtpHeight) - { - return null; - } - - // - // Symbol manipulation - // - - public void SymbolSetStateColor(Brush stateColor) - { - // access - if (this.SymbolElement == null) - return; - - // fill - foreach (var c in AasxWpfBaseUtils.LogicalTreeFindAllChildsWithRegexTag( - this.SymbolElement, "StateToFill")) - if (c != null) - { - c.Fill = stateColor; - } - - // stroke - foreach (var c in AasxWpfBaseUtils.LogicalTreeFindAllChildsWithRegexTag( - this.SymbolElement, "StateToStroke")) - if (c != null) - { - c.Stroke = stateColor; - } - } - - // - // Demo stuff - // - private int DemoIndex = 1; - - public virtual bool Demo(int mode) - { - return false; - } - - public void IncDemo() - { - if (!this.Demo(DemoIndex)) - { - this.Demo(1); - DemoIndex = 2; - } - else - DemoIndex++; - } - - protected void ButtonGo_Click(object sender, System.Windows.RoutedEventArgs e) - { - IncDemo(); - } - - // - // Units - // - - public class UnitRec - { - public int Id; - public string ShortText; - public string LongText; - - public UnitRec() { } - public UnitRec(int Id, string ShortText, string LongText) - { - this.Id = Id; - this.ShortText = ShortText; - this.LongText = LongText; - } - } - - private static UnitRec[] unitRecords = { - new UnitRec(1000, "K", "Kelvin"), - new UnitRec(1001, "°C", "Grad Celsius"), - new UnitRec(1002, "°F", "Grad Fahrenheit"), - new UnitRec(1005, "°", "Grad"), - new UnitRec(1006, "'", "Minute"), - new UnitRec(1007, "''", "Sekunde"), - new UnitRec(1010, "m", "Meter"), - new UnitRec(1013, "mm", "Millimeter"), - new UnitRec(1018, "ft", "Fuß"), - new UnitRec(1023, "m 2", " Quadratmeter"), - new UnitRec(1038, "l", "Liter"), - new UnitRec(1041, "hl", "Hektoliter"), - new UnitRec(1054, "s", "Sekunde"), - new UnitRec(1058, "min", "Minute"), - new UnitRec(1059, "h", "Stunde"), - new UnitRec(1060, "d", "Tag"), - new UnitRec(1061, "m/s", "Meter pro Sekunde"), - new UnitRec(1077, "Hz", "Hertz"), - new UnitRec(1081, "kHz", "Kilohertz"), - new UnitRec(1082, "1/s", "pro Sekunde"), - new UnitRec(1083, "1/min", "pro Minute"), - new UnitRec(1088, "kg", "Kilogramm"), - new UnitRec(1092, "t", "metrische Tonne"), - new UnitRec(1100, "g/cm 3", " Gramm pro Kubikzentimeter"), - new UnitRec(1105, "g/l", "Gramm pro Liter"), - new UnitRec(1120, "N", "Newton"), - new UnitRec(1123, "mN", "Millinewton"), - new UnitRec(1130, "Pa", "Pascal"), - new UnitRec(1133, "kPa", "Kilopascal"), - new UnitRec(1137, "bar", "Bar"), - new UnitRec(1138, "mbar", "Millibar"), - new UnitRec(1149, "mmH 2 O", "Millimeter Wassersäule"), - new UnitRec(1175, "Wh", "Wattstunde"), - new UnitRec(1179, "kWh", "Kilowattstunde"), - new UnitRec(1181, "kcalth", "Kilokalorien"), - new UnitRec(1190, "kW", "Kilowatt"), - new UnitRec(1209, "A", "Ampere"), - new UnitRec(1211, "mA", "Milliampere"), - new UnitRec(1221, "Ah", "Amperestunde"), - new UnitRec(1240, "V", "Volt"), - new UnitRec(1342, "%", "Prozent"), - new UnitRec(1349, "m3/h", "Kubikmeter pro Stunde"), - new UnitRec(1353, "l/h", "Liter pro Stunde"), - new UnitRec(1384, "mol", "Mol"), - new UnitRec(1422, "pH", "pH-Wert") - }; - - private static Dictionary unitIdToText = new Dictionary(); - - static MtpDynamicInstanceBase() - { - // initialize the patch tables - foreach (var ur in unitRecords) - unitIdToText.Add(ur.Id, ur); - } - - public UnitRec FindUnitById(int id) - { - if (unitIdToText.ContainsKey(id)) - return unitIdToText[id]; - return null; - } - - public string FindUnitTextById(int id) - { - var ur = FindUnitById(id); - if (ur == null) - return ""; - return ur.ShortText; - } - } - - public class MtpDiDataAssembly : MtpDynamicInstanceBase - { - // Remark: important to articulate all the properties with Get/Set for having Data Binding in place!! - // TagName - private string tagName = ""; - public string TagName - { - get { return tagName; } - set { tagName = value; RaisePropertyChanged("TagName"); } - } - - // TagDescription - private string tagDescription = ""; - public string TagDescription - { - get { return tagDescription; } - set { tagDescription = value; RaisePropertyChanged("TagDescription"); } - } - } - - public class MtpDiIndicatorElement : MtpDiDataAssembly - { - // WorstQualityCode - private byte wqc = 0xff; - public byte WorstQualityCode - { - get { return wqc; } - set - { - wqc = value; RaisePropertyChanged("WorstQualityCode"); - RaisePropertyChanged("WorstQualityCodeText"); RaisePropertyChanged("WorstQualityCodeBrush"); - } - } - public string WorstQualityCodeText - { - get { return String.Format("#{0:X02}", wqc); } - } - public Brush WorstQualityCodeBrush - { - get - { - if (wqc == 96) return Brushes.DarkBlue; // Simulation - if (wqc == 128) return Brushes.Green; // Good - if (wqc == 164) return Brushes.Yellow; // Maintenance - - if (wqc <= 40) return Brushes.Red; // Bad - if (wqc < 128) return Brushes.DarkOrange; // Uncertain - if (wqc < 255) return Brushes.Green; // also good? - return Brushes.Transparent; - } - } - } - - public class MtpDiAnaView : MtpDiIndicatorElement - { - // Value - private double valuex = 0.0; - public virtual double Value - { - // ReSharper disable once UnusedMemberHierarchy.Global - get { return valuex; } - set - { - valuex = value; RaisePropertyChanged("Value"); RaisePropertyChanged("ValuePercent"); - RaisePropertyChanged("ValueText"); - } - } - public double ValuePercent - { - get - { - return (valuex - valueScaleLowLimit) - / Math.Max(0.001, ValueScaleHighLimit - valueScaleLowLimit) * 100.0; - } - } - public string ValueText - { - get - { - var st = Value.ToString(CultureInfo.InvariantCulture); - // check the number of digits / decimal places - var dpi = st.IndexOf('.'); - if (st.Length >= 8 && st.Length - dpi > 4) - { - st = st.Substring(0, dpi + 4); - } - return st; - } - } - - // ValueScaleLowLimit - private double valueScaleLowLimit = 0.0; - public double ValueScaleLowLimit - { - get { return valueScaleLowLimit; } - set - { - valueScaleLowLimit = value; RaisePropertyChanged("ValueScaleLowLimit"); - RaisePropertyChanged("ValuePercent"); - } - } - - // ValueScaleHighLimit - private double valueScaleHighLimit = 0.0; - public double ValueScaleHighLimit - { - get { return valueScaleHighLimit; } - set - { - valueScaleHighLimit = value; RaisePropertyChanged("ValueScaleHighLimit"); - RaisePropertyChanged("ValuePercent"); - } - } - - // ValueUnit - private int valueUnit = 0; - public int ValueUnit - { - get { return valueUnit; } - set { valueUnit = value; RaisePropertyChanged("ValueUnit"); RaisePropertyChanged("ValueUnitText"); } - } - public string ValueUnitText { get { return this.FindUnitTextById(valueUnit); } } - - public override void PopulateFromAml(string Name, InternalElementType ie, MtpDataSourceSubscriber subscriber) - { - if (ie == null || subscriber == null) - return; - this.TagName = "" + Name; - - subscriber.SubscribeToAmlIdRefWith(ie.Attribute, "V", - (ct, o) => { this.Value = (double)o; }); - subscriber.SubscribeToAmlIdRefWith(ie.Attribute, "WQC", - (ct, o) => { this.WorstQualityCode = (byte)o; }); - subscriber.SubscribeToAmlIdRefWith(ie.Attribute, "VSclMin", - (ct, o) => { this.ValueScaleLowLimit = (double)o; }); - subscriber.SubscribeToAmlIdRefWith(ie.Attribute, "VSclMax", - (ct, o) => { this.ValueScaleHighLimit = (double)o; }); - subscriber.SubscribeToAmlIdRefWith(ie.Attribute, "VUnit", - (ct, o) => { this.ValueUnit = (int)o; }); - } - - public override UserControl CreateVisualObject(double mtpWidth, double mtpHeight) - { - UserControl c = null; - if (mtpWidth <= 50 || mtpHeight <= 40) - { - var bvt = new MtpViewAnaViewTiny(); - c = bvt; - c.Width = 80; - c.Height = 30; - c.DataContext = this; - bvt.ButtonGo.Click += ButtonGo_Click; - } - else - { - var bvl = new MtpViewAnaViewLarge(); - c = bvl; - c.Width = 130; - c.Height = 96; - c.DataContext = this; - bvl.ButtonGo.Click += ButtonGo_Click; - } - Demo(2); - return c; - } - - public override bool Demo(int mode) - { - if (mode == 1) - { - TagDescription = "This is a very long description of everything and even more"; - WorstQualityCode = 0xff; - Value = 345.678; - ValueUnit = 1001; - ValueScaleLowLimit = -23; - ValueScaleHighLimit = 960; - return true; - } - if (mode == 2) - { - TagDescription = "Another description"; - WorstQualityCode = 0xa5; - Value = 23.45; - ValueUnit = 1001; - ValueScaleLowLimit = -23; - ValueScaleHighLimit = 960; - return true; - } - if (mode == 3) - { - TagDescription = "Another description"; - WorstQualityCode = 0xa5; - Value = 390; - ValueUnit = 1001; - ValueScaleLowLimit = -23; - ValueScaleHighLimit = 960; - return true; - } - if (mode == 4) - { - TagDescription = "Former description"; - WorstQualityCode = 0x5a; - Value = 720.1111; - ValueUnit = 1002; - ValueScaleLowLimit = -23; - ValueScaleHighLimit = 960; - return true; - } - return false; - } - } - - public class MtpDiAnaMon : MtpDiAnaView - { - // Members - // basically 3 Limit Bands Tolerance, Warning, Alarm each with individual limit values and enables - - public class LimitBand - { - public double LimitValueLow, LimitValueHigh; - public bool LimitEnableLow, LimitEnableHigh; - public bool LimitActiveLow, LimitActiveHigh; - - public LimitBand() { } - - public LimitBand(double LimitValueLow, double LimitValueHigh, - bool LimitEnableLow, bool LimitEnableHigh, - bool LimitActiveLow, bool LimitActiveHigh) - { - this.LimitValueLow = LimitValueLow; - this.LimitValueHigh = LimitValueHigh; - this.LimitEnableLow = LimitEnableLow; - this.LimitEnableHigh = LimitEnableHigh; - this.LimitActiveLow = LimitActiveLow; - this.LimitActiveHigh = LimitActiveHigh; - } - - public bool EvalValueForLimitViolation(double value) - { - this.LimitActiveLow = this.LimitEnableLow && value < this.LimitValueLow; - this.LimitActiveHigh = this.LimitEnableHigh && value > this.LimitValueHigh; - return this.LimitActiveLow || this.LimitActiveHigh; - } - } - - public const int BandNone = -1; - public const int BandTolerance = 0; - public const int BandWarning = 1; - public const int BandAlarm = 2; - - public LimitBand[] Band = new LimitBand[] { new LimitBand(), new LimitBand(), new LimitBand() }; - - // concept of violatedBand - - private int violatedBand = BandNone; - public int ViolatedBand { get { return violatedBand; } } - - private string[] violatedBandText = new string[] { "TOL", "WARN", "ALRM" }; - public string ViolatedBandText - { - get - { - if (violatedBand < BandTolerance || violatedBand > BandAlarm) - return "none"; - return violatedBandText[violatedBand]; - } - } - - private Brush[] violatedBandBrush = new Brush[] { Brushes.DarkOrange, Brushes.OrangeRed, Brushes.Red }; - public Brush ViolatedBandBrush - { - get - { - if (violatedBand < BandTolerance || violatedBand > BandAlarm) - return Brushes.Transparent; - return violatedBandBrush[violatedBand]; - } - } - - // now: OVERIDE the getter/setter - - public override double Value - { - get - { - return base.Value; - } - set - { - base.Value = value; - - violatedBand = BandNone; - if (this.Band[BandTolerance].EvalValueForLimitViolation(value)) - violatedBand = BandTolerance; - if (this.Band[BandWarning].EvalValueForLimitViolation(value)) - violatedBand = BandWarning; - if (this.Band[BandAlarm].EvalValueForLimitViolation(value)) - violatedBand = BandAlarm; - - RaisePropertyChanged("ViolatedBand"); - RaisePropertyChanged("ViolatedBandText"); - RaisePropertyChanged("ViolatedBandBrush"); - } - } - - public override void PopulateFromAml(string Name, InternalElementType ie, MtpDataSourceSubscriber subscriber) - { - // call AnaView - base.PopulateFromAml(Name, ie, subscriber); - - // some more - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VAHEn", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandAlarm].LimitEnableHigh = (bool)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VAHLim", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandAlarm].LimitValueHigh = (double)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VAHAct", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandAlarm].LimitActiveHigh = (bool)o; }); - - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VWHEn", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandWarning].LimitEnableHigh = (bool)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VWHLim", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandWarning].LimitValueHigh = (double)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VWHAct", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandWarning].LimitActiveHigh = (bool)o; }); - - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VTHEn", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandTolerance].LimitEnableHigh = (bool)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VTHLim", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandTolerance].LimitValueHigh = (double)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VTHAct", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandTolerance].LimitActiveHigh = (bool)o; }); - - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VALEn", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandAlarm].LimitEnableLow = (bool)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VALLim", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandAlarm].LimitValueLow = (double)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VALAct", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandAlarm].LimitActiveLow = (bool)o; }); - - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VWLEn", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandWarning].LimitEnableLow = (bool)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VWLLim", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandWarning].LimitValueLow = (double)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VWLAct", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandWarning].LimitActiveLow = (bool)o; }); - - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VTLEn", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandTolerance].LimitEnableLow = (bool)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VTLLim", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandTolerance].LimitValueLow = (double)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VTLAct", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandTolerance].LimitActiveLow = (bool)o; }); - - } - - public override UserControl CreateVisualObject(double mtpWidth, double mtpHeight) - { - UserControl c = null; - if (mtpWidth <= 50 || mtpHeight <= 40) - { - var bvt = new MtpViewAnaMonTiny(); - c = bvt; - c.Width = 80; - c.Height = 30; - c.DataContext = this; - bvt.ButtonGo.Click += ButtonGo_Click; - } - else - { - var bvl = new MtpViewAnaViewLarge(); - c = bvl; - c.Width = 130; - c.Height = 96; - c.DataContext = this; - bvl.ButtonGo.Click += ButtonGo_Click; - } - Demo(2); - return c; - } - - public override bool Demo(int mode) - { - // most functionality is already in base class - base.Demo(mode); - - // often have the same limits - this.Band[BandTolerance] = new LimitBand(320, 380, true, true, true, true); - this.Band[BandWarning] = new LimitBand(200, 600, true, true, true, true); - this.Band[BandAlarm] = new LimitBand(100, 800, true, true, true, true); - - // some more tweaks? - if (mode == 1) - { - return true; - } - if (mode == 2) - { - return true; - } - if (mode == 3) - { - return true; - } - if (mode == 4) - { - return true; - } - return false; - } - } - - - - - - - - - - - public class MtpDiDIntView : MtpDiIndicatorElement - { - // Value - private int valuex = 0; - public virtual int Value - { - // ReSharper disable once UnusedMemberHierarchy.Global - get { return valuex; } - set - { - valuex = value; RaisePropertyChanged("Value"); RaisePropertyChanged("ValuePercent"); - RaisePropertyChanged("ValueText"); - } - } - public double ValuePercent - { - get - { - return (valuex - valueScaleLowLimit) - / Math.Max(0.001, ValueScaleHighLimit - valueScaleLowLimit) * 100.0; - } - } - public string ValueText - { - get - { - var st = Value.ToString(CultureInfo.InvariantCulture); - return st; - } - } - - // ValueScaleLowLimit - private int valueScaleLowLimit = 0; - public int ValueScaleLowLimit - { - get { return valueScaleLowLimit; } - set - { - valueScaleLowLimit = value; RaisePropertyChanged("ValueScaleLowLimit"); - RaisePropertyChanged("ValuePercent"); - } - } - - // ValueScaleHighLimit - private int valueScaleHighLimit = 0; - public int ValueScaleHighLimit - { - get { return valueScaleHighLimit; } - set - { - valueScaleHighLimit = value; RaisePropertyChanged("ValueScaleHighLimit"); - RaisePropertyChanged("ValuePercent"); - } - } - - // ValueUnit - private int valueUnit = 0; - public int ValueUnit - { - get { return valueUnit; } - set { valueUnit = value; RaisePropertyChanged("ValueUnit"); RaisePropertyChanged("ValueUnitText"); } - } - public string ValueUnitText { get { return this.FindUnitTextById(valueUnit); } } - - public override void PopulateFromAml(string Name, InternalElementType ie, MtpDataSourceSubscriber subscriber) - { - if (ie == null || subscriber == null) - return; - this.TagName = "" + Name; - - subscriber.SubscribeToAmlIdRefWith(ie.Attribute, "V", - (ct, o) => { this.Value = (int)o; }); - subscriber.SubscribeToAmlIdRefWith(ie.Attribute, "WQC", - (ct, o) => { this.WorstQualityCode = (byte)o; }); - subscriber.SubscribeToAmlIdRefWith(ie.Attribute, "VSclMin", - (ct, o) => { this.ValueScaleLowLimit = (int)o; }); - subscriber.SubscribeToAmlIdRefWith(ie.Attribute, "VSclMax", - (ct, o) => { this.ValueScaleHighLimit = (int)o; }); - subscriber.SubscribeToAmlIdRefWith(ie.Attribute, "VUnit", - (ct, o) => { this.ValueUnit = (int)o; }); - } - - public override UserControl CreateVisualObject(double mtpWidth, double mtpHeight) - { - UserControl c = null; - if (mtpWidth <= 50 || mtpHeight <= 40) - { - var bvt = new MtpViewAnaViewTiny(); - c = bvt; - c.Width = 80; - c.Height = 30; - c.DataContext = this; - bvt.ButtonGo.Click += ButtonGo_Click; - } - else - { - var bvl = new MtpViewAnaViewLarge(); - c = bvl; - c.Width = 130; - c.Height = 96; - c.DataContext = this; - bvl.ButtonGo.Click += ButtonGo_Click; - } - Demo(2); - return c; - } - - public override bool Demo(int mode) - { - if (mode == 1) - { - TagDescription = "This is a very long description of everything and even more"; - WorstQualityCode = 0xff; - Value = 345; - ValueUnit = 1001; - ValueScaleLowLimit = -23; - ValueScaleHighLimit = 960; - return true; - } - if (mode == 2) - { - TagDescription = "Another description"; - WorstQualityCode = 0xa5; - Value = 23; - ValueUnit = 1001; - ValueScaleLowLimit = -23; - ValueScaleHighLimit = 960; - return true; - } - if (mode == 3) - { - TagDescription = "Another description"; - WorstQualityCode = 0xa5; - Value = 390; - ValueUnit = 1001; - ValueScaleLowLimit = -23; - ValueScaleHighLimit = 960; - return true; - } - if (mode == 4) - { - TagDescription = "Former description"; - WorstQualityCode = 0x5a; - Value = 720; - ValueUnit = 1002; - ValueScaleLowLimit = -23; - ValueScaleHighLimit = 960; - return true; - } - return false; - } - } - - public class MtpDiDIntMon : MtpDiDIntView - { - // Members - // basically 3 Limit Bands Tolerance, Warning, Alarm each with individual limit values and enables - - public class LimitBand - { - public int LimitValueLow, LimitValueHigh; - public bool LimitEnableLow, LimitEnableHigh; - public bool LimitActiveLow, LimitActiveHigh; - - public LimitBand() { } - - public LimitBand(int LimitValueLow, int LimitValueHigh, - bool LimitEnableLow, bool LimitEnableHigh, - bool LimitActiveLow, bool LimitActiveHigh) - { - this.LimitValueLow = LimitValueLow; - this.LimitValueHigh = LimitValueHigh; - this.LimitEnableLow = LimitEnableLow; - this.LimitEnableHigh = LimitEnableHigh; - this.LimitActiveLow = LimitActiveLow; - this.LimitActiveHigh = LimitActiveHigh; - } - - public bool EvalValueForLimitViolation(int value) - { - this.LimitActiveLow = this.LimitEnableLow && value < this.LimitValueLow; - this.LimitActiveHigh = this.LimitEnableHigh && value > this.LimitValueHigh; - return this.LimitActiveLow || this.LimitActiveHigh; - } - } - - public const int BandNone = -1; - public const int BandTolerance = 0; - public const int BandWarning = 1; - public const int BandAlarm = 2; - - public LimitBand[] Band = new LimitBand[] { new LimitBand(), new LimitBand(), new LimitBand() }; - - // concept of violatedBand - - private int violatedBand = BandNone; - public int ViolatedBand { get { return violatedBand; } } - - private string[] violatedBandText = new string[] { "TOL", "WARN", "ALRM" }; - public string ViolatedBandText - { - get - { - if (violatedBand < BandTolerance || violatedBand > BandAlarm) - return "none"; - return violatedBandText[violatedBand]; - } - } - - private Brush[] violatedBandBrush = new Brush[] { Brushes.DarkOrange, Brushes.OrangeRed, Brushes.Red }; - public Brush ViolatedBandBrush - { - get - { - if (violatedBand < BandTolerance || violatedBand > BandAlarm) - return Brushes.Transparent; - return violatedBandBrush[violatedBand]; - } - } - - // now: OVERIDE the getter/setter - - public override int Value - { - get - { - return base.Value; - } - set - { - base.Value = value; - - violatedBand = BandNone; - if (this.Band[BandTolerance].EvalValueForLimitViolation(value)) - violatedBand = BandTolerance; - if (this.Band[BandWarning].EvalValueForLimitViolation(value)) - violatedBand = BandWarning; - if (this.Band[BandAlarm].EvalValueForLimitViolation(value)) - violatedBand = BandAlarm; - - RaisePropertyChanged("ViolatedBand"); - RaisePropertyChanged("ViolatedBandText"); - RaisePropertyChanged("ViolatedBandBrush"); - } - } - - public override void PopulateFromAml(string Name, InternalElementType ie, MtpDataSourceSubscriber subscriber) - { - // call AnaView - base.PopulateFromAml(Name, ie, subscriber); - - // some more - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VAHEn", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandAlarm].LimitEnableHigh = (bool)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VAHLim", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandAlarm].LimitValueHigh = (int)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VAHAct", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandAlarm].LimitActiveHigh = (bool)o; }); - - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VWHEn", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandWarning].LimitEnableHigh = (bool)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VWHLim", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandWarning].LimitValueHigh = (int)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VWHAct", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandWarning].LimitActiveHigh = (bool)o; }); - - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VTHEn", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandTolerance].LimitEnableHigh = (bool)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VTHLim", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandTolerance].LimitValueHigh = (int)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VTHAct", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandTolerance].LimitActiveHigh = (bool)o; }); - - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VALEn", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandAlarm].LimitEnableLow = (bool)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VALLim", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandAlarm].LimitValueLow = (int)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VALAct", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandAlarm].LimitActiveLow = (bool)o; }); - - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VWLEn", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandWarning].LimitEnableLow = (bool)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VWLLim", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandWarning].LimitValueLow = (int)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VWLAct", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandWarning].LimitActiveLow = (bool)o; }); - - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VTLEn", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandTolerance].LimitEnableLow = (bool)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VTLLim", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandTolerance].LimitValueLow = (int)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VTLAct", - (ct, o) => { if (this.Band?[BandAlarm] != null) this.Band[BandTolerance].LimitActiveLow = (bool)o; }); - - } - - public override UserControl CreateVisualObject(double mtpWidth, double mtpHeight) - { - UserControl c = null; - if (mtpWidth <= 50 || mtpHeight <= 40) - { - var bvt = new MtpViewAnaMonTiny(); - c = bvt; - c.Width = 80; - c.Height = 30; - c.DataContext = this; - bvt.ButtonGo.Click += ButtonGo_Click; - } - else - { - var bvl = new MtpViewAnaViewLarge(); - c = bvl; - c.Width = 130; - c.Height = 96; - c.DataContext = this; - bvl.ButtonGo.Click += ButtonGo_Click; - } - Demo(2); - return c; - } - - public override bool Demo(int mode) - { - // most functionality is already in base class - base.Demo(mode); - - // often have the same limits - this.Band[BandTolerance] = new LimitBand(320, 380, true, true, true, true); - this.Band[BandWarning] = new LimitBand(200, 600, true, true, true, true); - this.Band[BandAlarm] = new LimitBand(100, 800, true, true, true, true); - - // some more tweaks? - if (mode == 1) - { - return true; - } - if (mode == 2) - { - return true; - } - if (mode == 3) - { - return true; - } - if (mode == 4) - { - return true; - } - return false; - } - } - - public class MtpDiBinView : MtpDiIndicatorElement - { - // Value - private bool valState = false; - public bool Value - { - get { return valState; } - set - { - valState = value; - RaisePropertyChanged("Value"); - RaisePropertyChanged("ValueTinyText"); - RaisePropertyChanged("ValueText"); - RaisePropertyChanged("MoreText"); - RaisePropertyChanged("ValueFalseText"); - RaisePropertyChanged("ValueTrueText"); - RaisePropertyChanged("ValueFalseBrush"); - RaisePropertyChanged("ValueTrueBrush"); - RaisePropertyChanged("ValueBrush"); - } - } - - public string ValueTinyText - { - get - { - if (!valState) - { - return "FALSE"; - } - else - { - return "TRUE"; - } - } - } - - public string ValueText - { - get - { - if (!valState) - { - if (valState0 != null && valState0.Trim().Length > 0) - return valState0; - else - return "FALSE"; - } - else - { - if (valState1 != null && valState1.Trim().Length > 0) - return valState1; - else - return "TRUE"; - } - } - } - - public string MoreText - { - get - { - if (!valState) - { - if (valState0 != null && valState0.Trim().Length > 0) - return valState0; - else - return ""; - } - else - { - if (valState1 != null && valState1.Trim().Length > 0) - return valState1; - else - return ""; - } - } - } - - public string ValueFalseText - { - get { if (!valState) { return "FALSE"; } else { return ""; } } - } - public string ValueTrueText - { - get { if (!valState) { return ""; } else { return "TRUE"; } } - } - - public Brush ValueFalseBrush - { - get { if (!valState) { return Brushes.Red; } else { return Brushes.Transparent; } } - } - public Brush ValueTrueBrush - { - get { if (!valState) { return Brushes.Transparent; } else { return Brushes.Green; } } - } - public Brush ValueBrush - { - get { if (valState) { return Brushes.Green; } else { return Brushes.Red; } } - } - - // String replacements - private string valState0 = ""; - public string ValState0 - { - get { return valState0; } - set { valState0 = value; RaisePropertyChanged("ValState0"); } - } - - private string valState1 = ""; - public string ValState1 - { - get { return valState1; } - set { valState1 = value; RaisePropertyChanged("ValState1"); } - } - - // Construct - - public override void PopulateFromAml(string Name, InternalElementType ie, MtpDataSourceSubscriber subscriber) - { - this.TagName = "" + Name; - - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "V", - (ct, o) => { this.Value = (bool)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "WQC", - (ct, o) => { this.WorstQualityCode = (byte)o; }); - - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VState0", - (ct, o) => { this.ValState0 = (string)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VState1", - (ct, o) => { this.ValState1 = (string)o; }); - } - - public override UserControl CreateVisualObject(double mtpWidth, double mtpHeight) - { - UserControl c = null; - if (mtpWidth <= 50 || mtpHeight <= 40) - { - var bvt = new MtpViewBinViewTiny(); - c = bvt; - c.Width = 40; - c.Height = 30; - c.DataContext = this; - bvt.ButtonGo.Click += ButtonGo_Click; - } - else - { - var bvl = new MtpViewBinViewLarge(); - c = bvl; - c.Width = 130; - c.Height = 96; - c.DataContext = this; - bvl.ButtonGo.Click += ButtonGo_Click; - } - Demo(2); - return c; - } - - public override bool Demo(int mode) - { - if (mode == 1) - { - TagDescription = "This is a very long description of everything and even more"; - WorstQualityCode = 0xff; - Value = true; - ValState0 = "Falsch ist leer"; - ValState1 = "Wahr ist klar"; - return true; - } - if (mode == 2) - { - TagDescription = "Another description"; - WorstQualityCode = 0xa5; - Value = false; - ValState0 = "Falsch ist leer"; - ValState1 = "Wahr ist klar"; - return true; - } - return false; - } - } - - public class MtpDiBinMon : MtpDiBinView - { - public bool EnableFlutterRecog; - public double FlutterTimeInterval; - public int FlutterCounts; - public bool FlutterIsActive; - - public override void PopulateFromAml(string Name, InternalElementType ie, MtpDataSourceSubscriber subscriber) - { - // call AnaView - base.PopulateFromAml(Name, ie, subscriber); - - // some more - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VFlutEn", - (ct, o) => { this.EnableFlutterRecog = (bool)o; }); - - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VFlutTi", - (ct, o) => { this.FlutterTimeInterval = (double)o; }); - - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VFlutCnt", - (ct, o) => { this.FlutterCounts = (int)o; }); - - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "VFlutAct", - (ct, o) => { this.FlutterIsActive = (bool)o; }); - } - } - - public class MtpDiActiveElement : MtpDiIndicatorElement - { - // Note: now spec, yet - // therefore not sure, what common elements are - } - - public class MtpDiBinValve : MtpDiActiveElement - { - public bool Ctrl; - - public MtpDiBinValve() : base() - { - this.DrawSymbolAsWell = true; - } - - public override void PopulateFromAml(string Name, InternalElementType ie, MtpDataSourceSubscriber subscriber) - { - // call AnaView - base.PopulateFromAml(Name, ie, subscriber); - - // some more - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "Ctrl", - (ct, o) => { this.Ctrl = (bool)o; DemandRedrawOnTick(); }); - } - - public override UserControl CreateVisualObject(double mtpWidth, double mtpHeight) - { - var c = new MtpViewBinValve(); - c.Width = mtpWidth; - c.Height = mtpHeight; - c.DataContext = this; - return c; - } - - public override void RedrawSymbol(MtpVisuOptions visuOptions = null) - { - // what color? - Brush color = null; - if (this.Ctrl) - { - color = (visuOptions?.StateColorActiveBrush != null) - ? visuOptions.StateColorActiveBrush : Brushes.Red; - } - else - { - color = (visuOptions?.StateColorNonActiveBrush != null) - ? visuOptions.StateColorNonActiveBrush : Brushes.Black; - } - - // set - if (color != null) - this.SymbolSetStateColor(color); - } - - } - - public class MtpDiMonBinValve : MtpDiBinValve - { - // members only selected, a lot of "unnecessary" memebrs - public bool ErrorActiveStatic; - public bool ErrorActiveDynamic; - - public override void PopulateFromAml(string Name, InternalElementType ie, MtpDataSourceSubscriber subscriber) - { - // call MtpDiBinValve - base.PopulateFromAml(Name, ie, subscriber); - - // some more - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "MonStatErr", - (ct, o) => { this.ErrorActiveStatic = (bool)o; }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "MonDynErr", - (ct, o) => { this.ErrorActiveDynamic = (bool)o; }); - } - - } - - public class MtpDiBinDrive : MtpDiActiveElement - { - public bool ForwardCtrl; - public bool ReverseCtrl; - - public MtpDiBinDrive() : base() - { - this.DrawSymbolAsWell = true; - } - - public override void PopulateFromAml(string Name, InternalElementType ie, MtpDataSourceSubscriber subscriber) - { - // call AnaView - base.PopulateFromAml(Name, ie, subscriber); - - // some more - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "FwdCtrl", - (ct, o) => { this.ForwardCtrl = (bool)o; DemandRedrawOnTick(); }); - subscriber?.SubscribeToAmlIdRefWith(ie.Attribute, "RevCtrl", - (ct, o) => { this.ReverseCtrl = (bool)o; DemandRedrawOnTick(); }); - } - - public override UserControl CreateVisualObject(double mtpWidth, double mtpHeight) - { - var c = new MtpViewBinDrive(); - c.Width = mtpWidth; - c.Height = mtpHeight; - c.DataContext = this; - return c; - } - - public override void RedrawSymbol(MtpVisuOptions visuOptions = null) - { - // what color? - Brush color = null; - if (this.ForwardCtrl && !this.ReverseCtrl) - { - color = (visuOptions?.StateColorForwardBrush != null) - ? visuOptions.StateColorForwardBrush : Brushes.Blue; - } - else if (!this.ForwardCtrl && this.ReverseCtrl) - { - color = (visuOptions?.StateColorReverseBrush != null) - ? visuOptions.StateColorReverseBrush : Brushes.Red; - } - else - { - color = (visuOptions?.StateColorNonActiveBrush != null) - ? visuOptions.StateColorNonActiveBrush : Brushes.Black; - } - - // set - if (color != null) - this.SymbolSetStateColor(color); - } - - } - - public class MtpDiPIDCntl : MtpDiActiveElement - { - // Not sure which members to expose here - - public enum OpState { Off = 0, Op, Aut } - public string[] OpStateText = new string[] { "Off", "Op", "Aut" }; - public Brush[] OpStateBrush = new Brush[] { Brushes.DarkGray, Brushes.Gold, Brushes.Green }; - - // Value - private OpState valState = OpState.Aut; - public OpState Value - { - get { return valState; } - set - { - valState = value; - RaisePropertyChanged("Value"); - RaisePropertyChanged("ValueText"); - RaisePropertyChanged("ValueBrush"); - } - } - - public string ValueText - { - get - { - var i = (int)valState; - if (i >= 0 && i < OpStateText.Length) - return OpStateText[i]; - return "?"; - } - } - - public Brush ValueBrush - { - get - { - var i = (int)valState; - if (i >= 0 && i < OpStateBrush.Length) - return OpStateBrush[i]; - return Brushes.Red; - } - } - - // Construct - - public override void PopulateFromAml(string Name, InternalElementType ie, MtpDataSourceSubscriber subscriber) - { - this.TagName = "" + Name; - } - - public override UserControl CreateVisualObject(double mtpWidth, double mtpHeight) - { - UserControl c = null; - // ReSharper disable HeuristicUnreachableCode - // ReSharper disable once ConditionIsAlwaysTrueOrFalse -#pragma warning disable 162 - if (true || mtpWidth <= 50 || mtpHeight <= 40) -#pragma warning restore 162 - { - var bvt = new MtpViewPIDCntlTiny(); - c = bvt; - c.Width = 40; - c.Height = 30; - c.DataContext = this; - bvt.ButtonGo.Click += ButtonGo_Click; - } - else - -#pragma warning disable 162 - { - // ReSharper disable once HeuristicUnreachableCode - var bvl = new MtpViewBinViewLarge(); - c = bvl; - c.Width = 130; - c.Height = 96; - c.DataContext = this; - bvl.ButtonGo.Click += ButtonGo_Click; - } -#pragma warning restore 162 - Demo(2); - // ReSharper enable HeuristicUnreachableCode - return c; - } - - public override bool Demo(int mode) - { - if (mode == 1) - { - TagDescription = "This is a very long description of everything and even more"; - WorstQualityCode = 0xff; - Value = OpState.Off; - return true; - } - if (mode == 2) - { - TagDescription = "Another description"; - WorstQualityCode = 0xa5; - Value = OpState.Aut; - return true; - } - if (mode == 3) - { - TagDescription = "Yet Another description"; - WorstQualityCode = 0x55; - Value = OpState.Op; - return true; - } - return false; - } - } -} diff --git a/src/WpfMtpControl/DynamicInstances/MtpViewAnaMonTiny.xaml b/src/WpfMtpControl/DynamicInstances/MtpViewAnaMonTiny.xaml deleted file mode 100644 index 546a78548..000000000 --- a/src/WpfMtpControl/DynamicInstances/MtpViewAnaMonTiny.xaml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/WpfMtpControl/DynamicInstances/MtpViewAnaMonTiny.xaml.cs b/src/WpfMtpControl/DynamicInstances/MtpViewAnaMonTiny.xaml.cs deleted file mode 100644 index 5bc480c65..000000000 --- a/src/WpfMtpControl/DynamicInstances/MtpViewAnaMonTiny.xaml.cs +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; - -namespace Mtp.DynamicInstances -{ - public partial class MtpViewAnaMonTiny : UserControl - { - public MtpViewAnaMonTiny() - { - InitializeComponent(); - } - } -} diff --git a/src/WpfMtpControl/DynamicInstances/MtpViewAnaViewLarge.xaml b/src/WpfMtpControl/DynamicInstances/MtpViewAnaViewLarge.xaml deleted file mode 100644 index 9ae8fedb4..000000000 --- a/src/WpfMtpControl/DynamicInstances/MtpViewAnaViewLarge.xaml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/WpfMtpControl/DynamicInstances/MtpViewAnaViewLarge.xaml.cs b/src/WpfMtpControl/DynamicInstances/MtpViewAnaViewLarge.xaml.cs deleted file mode 100644 index 7e3baafa6..000000000 --- a/src/WpfMtpControl/DynamicInstances/MtpViewAnaViewLarge.xaml.cs +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; - -namespace Mtp.DynamicInstances -{ - public partial class MtpViewAnaViewLarge : UserControl - { - public MtpViewAnaViewLarge() - { - InitializeComponent(); - } - } -} diff --git a/src/WpfMtpControl/DynamicInstances/MtpViewAnaViewTiny.xaml b/src/WpfMtpControl/DynamicInstances/MtpViewAnaViewTiny.xaml deleted file mode 100644 index 4ee454d59..000000000 --- a/src/WpfMtpControl/DynamicInstances/MtpViewAnaViewTiny.xaml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/WpfMtpControl/DynamicInstances/MtpViewAnaViewTiny.xaml.cs b/src/WpfMtpControl/DynamicInstances/MtpViewAnaViewTiny.xaml.cs deleted file mode 100644 index 8e9961d47..000000000 --- a/src/WpfMtpControl/DynamicInstances/MtpViewAnaViewTiny.xaml.cs +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; - -namespace Mtp.DynamicInstances -{ - public partial class MtpViewAnaViewTiny : UserControl - { - public MtpViewAnaViewTiny() - { - InitializeComponent(); - } - } -} diff --git a/src/WpfMtpControl/DynamicInstances/MtpViewBinDrive.xaml b/src/WpfMtpControl/DynamicInstances/MtpViewBinDrive.xaml deleted file mode 100644 index 8c331ff21..000000000 --- a/src/WpfMtpControl/DynamicInstances/MtpViewBinDrive.xaml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/src/WpfMtpControl/DynamicInstances/MtpViewBinDrive.xaml.cs b/src/WpfMtpControl/DynamicInstances/MtpViewBinDrive.xaml.cs deleted file mode 100644 index d3b3f2af1..000000000 --- a/src/WpfMtpControl/DynamicInstances/MtpViewBinDrive.xaml.cs +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; - -namespace Mtp.DynamicInstances -{ - public partial class MtpViewBinDrive : UserControl - { - public MtpViewBinDrive() - { - InitializeComponent(); - } - } -} diff --git a/src/WpfMtpControl/DynamicInstances/MtpViewBinValve.xaml b/src/WpfMtpControl/DynamicInstances/MtpViewBinValve.xaml deleted file mode 100644 index 62b279a99..000000000 --- a/src/WpfMtpControl/DynamicInstances/MtpViewBinValve.xaml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/src/WpfMtpControl/DynamicInstances/MtpViewBinValve.xaml.cs b/src/WpfMtpControl/DynamicInstances/MtpViewBinValve.xaml.cs deleted file mode 100644 index 8e9fbec88..000000000 --- a/src/WpfMtpControl/DynamicInstances/MtpViewBinValve.xaml.cs +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; - -namespace Mtp.DynamicInstances -{ - public partial class MtpViewBinValve : UserControl - { - public MtpViewBinValve() - { - InitializeComponent(); - } - } -} diff --git a/src/WpfMtpControl/DynamicInstances/MtpViewBinViewLarge.xaml b/src/WpfMtpControl/DynamicInstances/MtpViewBinViewLarge.xaml deleted file mode 100644 index 44bfc5b4e..000000000 --- a/src/WpfMtpControl/DynamicInstances/MtpViewBinViewLarge.xaml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/WpfMtpControl/DynamicInstances/MtpViewBinViewLarge.xaml.cs b/src/WpfMtpControl/DynamicInstances/MtpViewBinViewLarge.xaml.cs deleted file mode 100644 index 1ee000019..000000000 --- a/src/WpfMtpControl/DynamicInstances/MtpViewBinViewLarge.xaml.cs +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; - -namespace Mtp.DynamicInstances -{ - public partial class MtpViewBinViewLarge : UserControl - { - public MtpViewBinViewLarge() - { - InitializeComponent(); - } - } -} diff --git a/src/WpfMtpControl/DynamicInstances/MtpViewBinViewTiny.xaml b/src/WpfMtpControl/DynamicInstances/MtpViewBinViewTiny.xaml deleted file mode 100644 index c91260680..000000000 --- a/src/WpfMtpControl/DynamicInstances/MtpViewBinViewTiny.xaml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/WpfMtpControl/DynamicInstances/MtpViewBinViewTiny.xaml.cs b/src/WpfMtpControl/DynamicInstances/MtpViewBinViewTiny.xaml.cs deleted file mode 100644 index 364be0923..000000000 --- a/src/WpfMtpControl/DynamicInstances/MtpViewBinViewTiny.xaml.cs +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; - -namespace Mtp.DynamicInstances -{ - public partial class MtpViewBinViewTiny : UserControl - { - public MtpViewBinViewTiny() - { - InitializeComponent(); - } - } -} diff --git a/src/WpfMtpControl/DynamicInstances/MtpViewPIDCntlTiny.xaml b/src/WpfMtpControl/DynamicInstances/MtpViewPIDCntlTiny.xaml deleted file mode 100644 index b2a146176..000000000 --- a/src/WpfMtpControl/DynamicInstances/MtpViewPIDCntlTiny.xaml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/WpfMtpControl/DynamicInstances/MtpViewPIDCntlTiny.xaml.cs b/src/WpfMtpControl/DynamicInstances/MtpViewPIDCntlTiny.xaml.cs deleted file mode 100644 index e87dbe568..000000000 --- a/src/WpfMtpControl/DynamicInstances/MtpViewPIDCntlTiny.xaml.cs +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; - -namespace Mtp.DynamicInstances -{ - public partial class MtpViewPIDCntlTiny : UserControl - { - public MtpViewPIDCntlTiny() - { - InitializeComponent(); - } - } -} diff --git a/src/WpfMtpControl/LICENSE.txt b/src/WpfMtpControl/LICENSE.txt deleted file mode 100644 index 01f9cb5eb..000000000 --- a/src/WpfMtpControl/LICENSE.txt +++ /dev/null @@ -1,1475 +0,0 @@ -Copyright (c) 2018-2023 Festo SE & Co. KG -, -author: Michael Hoffmeister - -Copyright (c) 2019-2021 PHOENIX CONTACT GmbH & Co. KG -, -author: Andreas Orzelski - -Copyright (c) 2019-2020 Fraunhofer IOSB-INA Lemgo, - eine rechtlich nicht selbstaendige Einrichtung der Fraunhofer-Gesellschaft - zur Foerderung der angewandten Forschung e.V. - -Copyright (c) 2020 Schneider Electric Automation GmbH -, -author: Marco Mendes - -Copyright (c) 2020 SICK AG - -Copyright (c) 2021 KEB Automation KG - -Copyright (c) 2021 Lenze SE -author: Jonas Grote, Denis Göllner, Sebastian Bischof - -The AASX Package Explorer is licensed under the Apache License 2.0 -(Apache-2.0, see below). - -The AASX Package Explorer is a sample application for demonstration of the -features of the Asset Administration Shell. -The implementation uses the concepts of the document "Details of the Asset -Administration Shell" published on www.plattform-i40.de which is licensed -under Creative Commons CC BY-ND 3.0 DE. - -When using eCl@ss or IEC CDD data, please check the corresponding license -conditions. - -------------------------------------------------------------------------------- - -The components below are used in AASX Package Explorer. -The related licenses are listed for information purposes only. -Some licenses may only apply to their related plugins. - -The browser functionality is licensed under the cefSharp license (see below). - -The Newtonsoft.JSON serialization is licensed under the MIT License -(MIT, see below). - -The QR code generation is licensed under the MIT license (MIT, see below). - -The Zxing.Net Dot Matrix Code (DMC) generation is licensed under -the Apache License 2.0 (Apache-2.0, see below). - -The Grapevine REST server framework is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The AutomationML.Engine is licensed under the MIT license (MIT, see below). - -The MQTT server and client is licensed under the MIT license (MIT, see below). - -The ClosedXML Excel reader/writer is licensed under the MIT license (MIT, -see below). - -The CountryFlag WPF control is licensed under the Code Project Open License -(CPOL, see below). - -The DocumentFormat.OpenXml SDK is licensed under the MIT license (MIT, -see below). - -The ExcelNumberFormat number parser is licensed under the MIT license (MIT, -see below). - -The FastMember reflection access is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The IdentityModel OpenID client is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The jose-jwt object signing and encryption is licensed under the -MIT license (MIT, see below). - -The ExcelDataReader is licensed under the MIT license (MIT, see below). - -Portions copyright (c) by OPC Foundation, Inc. and licensed under the -Reciprocal Community License (RCL, see below) - -The OPC UA Example Code of OPC UA Standard is licensed under the MIT license -(MIT, see below). - -The MSAGL (Microsoft Automatic Graph Layout) is licensed under the MIT license -(MIT, see below) - -Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license -(MIT, see below). - -The Magick.NET library is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed -under Apache License 2.0 (Apache-2.0, see below). - -------------------------------------------------------------------------------- - - -With respect to AASX Package Explorer -===================================== - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to cefSharp -======================== - -(https://raw.githubusercontent.com/cefsharp/CefSharp/master/LICENSE) - -Copyright © The CefSharp Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - * Neither the name of Google Inc. nor the name Chromium Embedded - Framework nor the name CefSharp nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -With respect to Newtonsoft.Json -=============================== - -(https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md) - -The MIT License (MIT) - -Copyright (c) 2007 James Newton-King - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to QRcoder -======================= - -(https://github.com/codebude/QRCoder/blob/master/LICENSE.txt) - -The MIT License (MIT) - -Copyright (c) 2013-2018 Raffael Herrmann - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to ZXing.Net -========================= -With respect to Grapevine -========================= -With respect to FastMember -========================== -With respect to IdentityModel -============================= - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to AutomationML.Engine -=================================== - -(https://raw.githubusercontent.com/AutomationML/AMLEngine2.1/master/license.txt) - -The MIT License (MIT) - -Copyright 2017 AutomationML e.V. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - -With respect to MQTTnet -======================= - -(https://github.com/chkr1011/MQTTnet/blob/master/LICENSE) - -MIT License - -MQTTnet Copyright (c) 2016-2019 Christian Kratky - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to ClosedXML -========================= - -(https://github.com/ClosedXML/ClosedXML/blob/develop/LICENSE) - -MIT License - -Copyright (c) 2016 ClosedXML - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to CountryFlag -=========================== - -(https://www.codeproject.com/Articles/190722/WPF-CountryFlag-Control) - -The Code Project Open License (CPOL) 1.02 - -Copyright © 2017 Meshack Musundi - -Preamble - -This License governs Your use of the Work. This License is intended to allow -developers to use the Source Code and Executable Files provided as part of -the Work in any application in any form. - -The main points subject to the terms of the License are: - - Source Code and Executable Files can be used in commercial applications; - Source Code and Executable Files can be redistributed; and - Source Code can be modified to create derivative works. - No claim of suitability, guarantee, or any warranty whatsoever is provided. - The software is provided "as-is". - The Article(s) accompanying the Work may not be distributed or republished - without the Author's consent - -This License is entered between You, the individual or other entity reading or -otherwise making use of the Work licensed pursuant to this License and the -individual or other entity which offers the Work under the terms of this -License ("Author"). - -License - -THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS -CODE PROJECT OPEN LICENSE ("LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT -AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED -UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. - -BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HEREIN, YOU ACCEPT AND AGREE -TO BE BOUND BY THE TERMS OF THIS LICENSE. THE AUTHOR GRANTS YOU THE RIGHTS -CONTAINED HEREIN IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND -CONDITIONS. IF YOU DO NOT AGREE TO ACCEPT AND BE BOUND BY THE TERMS OF THIS -LICENSE, YOU CANNOT MAKE ANY USE OF THE WORK. - -Definitions. - "Articles" means, collectively, all articles written by Author which -describes how the Source Code and Executable Files for the Work may -be used by a user. - "Author" means the individual or entity that offers the Work under -the terms of this License. - "Derivative Work" means a work based upon the Work or upon the Work -and other pre-existing works. - "Executable Files" refer to the executables, binary files, -configuration and any required data files included in the Work. - "Publisher" means the provider of the website, magazine, CD-ROM, -DVD or other medium from or by which the Work is obtained by You. - "Source Code" refers to the collection of source code and -configuration files used to create the Executable Files. - "Standard Version" refers to such a Work if it has not been modified, -or has been modified in accordance with the consent of the Author, -such consent being in the full discretion of the Author. - "Work" refers to the collection of files distributed by the Publisher, -including the Source Code, Executable Files, binaries, data files, -documentation, whitepapers and the Articles. - "You" is you, an individual or entity wishing to use the Work and -exercise your rights under this License. - -Fair Use/Fair Use Rights. Nothing in this License is intended to reduce, -limit, or restrict any rights arising from fair use, fair dealing, -first sale or other limitations on the exclusive rights of the -copyright owner under copyright law or other applicable laws. - -License Grant. Subject to the terms and conditions of this License, the -Author hereby grants You a worldwide, royalty-free, non-exclusive, -perpetual (for the duration of the applicable copyright) license -to exercise the rights in the Work as stated below: - You may use the standard version of the Source Code or Executable -Files in Your own applications. - You may apply bug fixes, portability fixes and other modifications -obtained from the Public Domain or from the Author. A Work modified -in such a way shall still be considered the standard version and will -be subject to this License. - You may otherwise modify Your copy of this Work (excluding the Articles) -in any way to create a Derivative Work, provided that You insert a prominent -notice in each changed file stating how, when and where You changed that file. - You may distribute the standard version of the Executable Files and Source -Code or Derivative Work in aggregate with other (possibly commercial) -programs as part of a larger (possibly commercial) software distribution. - The Articles discussing the Work published in any form by the author may -not be distributed or republished without the Author's consent. The author -retains copyright to any such Articles. You may use the Executable Files and -Source Code pursuant to this License but you may not repost or republish or -otherwise distribute or make available the Articles, without the prior written -consent of the Author. - -Any subroutines or modules supplied by You and linked into the Source Code -or Executable Files of this Work shall not be considered part of this Work -and will not be subject to the terms of this License. - -Patent License. Subject to the terms and conditions of this License, each -Author hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, -royalty-free, irrevocable (except as stated in this section) patent license -to make, have made, use, import, and otherwise transfer the Work. - -Restrictions. The license granted in Section 3 above is expressly made subject -to and limited by the following restrictions: - You agree not to remove any of the original copyright, patent, trademark, -and attribution notices and associated disclaimers that may appear in the -Source Code or Executable Files. - You agree not to advertise or in any way imply that this Work is a product -of Your own. - The name of the Author may not be used to endorse or promote products -derived from the Work without the prior written consent of the Author. - You agree not to sell, lease, or rent any part of the Work. This does -not restrict you from including the Work or any part of the Work inside -a larger software distribution that itself is being sold. The Work by itself, -though, cannot be sold, leased or rented. - You may distribute the Executable Files and Source Code only under the terms -of this License, and You must include a copy of, or the Uniform Resource -Identifier for, this License with every copy of the Executable Files or -Source Code You distribute and ensure that anyone receiving such Executable -Files and Source Code agrees that the terms of this License apply to such -Executable Files and/or Source Code. You may not offer or impose any terms -on the Work that alter or restrict the terms of this License or the -recipients' exercise of the rights granted hereunder. You may not sublicense -the Work. You must keep intact all notices that refer to this License and to -the disclaimer of warranties. You may not distribute the Executable Files or -Source Code with any technological measures that control access or use of the -Work in a manner inconsistent with the terms of this License. - You agree not to use the Work for illegal, immoral or improper -purposes, or on pages containing illegal, immoral or improper material. -The Work is subject to applicable export laws. You agree to comply with all -such laws and regulations that may apply to the Work after Your receipt of -the Work. - -Representations, Warranties and Disclaimer. THIS WORK IS PROVIDED "AS IS", -"WHERE IS" AND "AS AVAILABLE", WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OR -CONDITIONS OR GUARANTEES. YOU, THE USER, ASSUME ALL RISK IN ITS USE, -INCLUDING COPYRIGHT INFRINGEMENT, PATENT INFRINGEMENT, SUITABILITY, ETC. -AUTHOR EXPRESSLY DISCLAIMS ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES -OR CONDITIONS, INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS -OF MERCHANTABILITY, MERCHANTABLE QUALITY OR FITNESS FOR A PARTICULAR -PURPOSE, OR ANY WARRANTY OF TITLE OR NON-INFRINGEMENT, OR THAT THE WORK -(OR ANY PORTION THEREOF) IS CORRECT, USEFUL, BUG-FREE OR FREE OF VIRUSES. -YOU MUST PASS THIS DISCLAIMER ON WHENEVER YOU DISTRIBUTE THE WORK OR DERIVATIVE -WORKS. - -Indemnity. You agree to defend, indemnify and hold harmless the Author and the -Publisher from and against any claims, suits, losses, damages, liabilities, -costs, and expenses (including reasonable legal or attorneys’ fees) -resulting from or relating to any use of the Work by You. - -Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, -IN NO EVENT WILL THE AUTHOR OR THE PUBLISHER BE LIABLE TO YOU ON ANY LEGAL -THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY -DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK OR OTHERWISE, -EVEN IF THE AUTHOR OR THE PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY -OF SUCH DAMAGES. - -Termination. - This License and the rights granted hereunder will terminate -automatically upon any breach by You of any term of this License. -Individuals or entities who have received Derivative Works from You under -this License, however, will not have their licenses terminated provided such -individuals or entities remain in full compliance with those licenses. -Sections 1, 2, 6, 7, 8, 9, 10 and 11 will survive any termination of -this License. - If You bring a copyright, trademark, patent or any other infringement -claim against any contributor over infringements You claim are made by the -Work, your License from such contributor to the Work ends automatically. - Subject to the above terms and conditions, this License is perpetual -(for the duration of the applicable copyright in the Work). -Notwithstanding the above, the Author reserves the right to release the Work -under different license terms or to stop distributing the Work at any time; -provided, however that any such election will not serve to withdraw this -License (or any other license that has been, or is required to be, -granted under the terms of this License), and this License will continue -in full force and effect unless terminated as stated above. - -Publisher. The parties hereby confirm that the Publisher shall not, under -any circumstances, be responsible for and shall not have any liability -in respect of the subject matter of this License. The Publisher makes no -warranty whatsoever in connection with the Work and shall not be liable -to You or any party on any legal theory for any damages whatsoever, including -without limitation any general, special, incidental or consequential damages -arising in connection to this license. The Publisher reserves the right to -cease making the Work available to You at any time without notice - -Miscellaneous - This License shall be governed by the laws of the location of the head -office of the Author or if the Author is an individual, the laws of -location of the principal place of residence of the Author. - If any provision of this License is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of the -remainder of the terms of this License, and without further action by the -parties to this License, such provision shall be reformed to the minimum -extent necessary to make such provision valid and enforceable. - No term or provision of this License shall be deemed waived and no -breach consented to unless such waiver or consent shall be in writing -and signed by the party to be charged with such waiver or consent. - This License constitutes the entire agreement between the parties -with respect to the Work licensed herein. There are no understandings, -agreements or representations with respect to the Work not specified herein. -The Author shall not be bound by any additional provisions that may appear -in any communication from You. This License may not be modified without -the mutual written agreement of the Author and You. - - -With respect to DocumentFormat.OpenXml -====================================== - -(https://github.com/OfficeDev/Open-XML-SDK/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to ExcelNumberFormat -================================= - -(https://github.com/andersnm/ExcelNumberFormat/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2017 andersnm - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to jose-jwt -======================== - -(https://github.com/dvsekhvalnov/jose-jwt/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014-2019 dvsekhvalnov - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With resepect to ExcelDataReader -================================ - -(https://github.com/ExcelDataReader/ExcelDataReader/blob/develop/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014 ExcelDataReader - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepect to OPC UA Example Code -==================================== - - * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved. - * - * OPC Foundation MIT License 1.00 - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * The complete license agreement can be found here: - * http://opcfoundation.org/License/MIT/1.00/ - - -With respect to OPC Foundation -============================== - -RCL License -Reciprocal Community License 1.00 (RCL1.00) -Version 1.00, June 24, 2009 -Copyright (C) 2008,2009 OPC Foundation, Inc., All Rights Reserved. - -https://opcfoundation.org/license/rcl.html - -Remark: PHOENIX CONTACT GmbH & Co. KG and Festo SE & Co. KG are members -of OPC foundation. - -With respect to MSAGL (Microsoft Automatic Graph Layout) -======================================================== -(see: https://github.com/microsoft/automatic-graph-layout/blob/master/LICENSE) - -Microsoft Automatic Graph Layout, MSAGL - -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -""Software""), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With respect to Glob (https://www.nuget.org/packages/Glob/) -=========================================================== -(see: https://raw.githubusercontent.com/kthompson/glob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2013-2019 Kevin Thompson - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to Magick.NET -========================== - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -With respect to SSharp.NET library -================================== - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/src/WpfMtpControl/MtpAmlHelper.cs b/src/WpfMtpControl/MtpAmlHelper.cs deleted file mode 100644 index 66ad55942..000000000 --- a/src/WpfMtpControl/MtpAmlHelper.cs +++ /dev/null @@ -1,285 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Media; -using AasxIntegrationBase; -using Aml.Engine.CAEX; -using WpfMtpControl.DataSources; - -namespace WpfMtpControl -{ - // ReSharper disable once ClassNeverInstantiated.Global - public class MtpAmlHelper - { - public static bool CheckForRole(CAEXSequence seq, string refRoleClassPath) - { - if (seq == null) - return false; - foreach (var src in seq) - if (src.RefRoleClassPath != null && src.RefRoleClassPath.Trim() != "") - if (src.RefRoleClassPath.Trim().ToLower() == refRoleClassPath.Trim().ToLower()) - return true; - return false; - } - - public static bool CheckForRole(CAEXSequence seq, string refBaseRoleClassPath) - { - if (seq == null) - return false; - foreach (var src in seq) - if (src.RefBaseRoleClassPath != null && src.RefBaseRoleClassPath.Trim() != "") - if (src.RefBaseRoleClassPath.Trim().ToLower() == refBaseRoleClassPath.Trim().ToLower()) - return true; - return false; - } - - public static bool CheckForRoleClassOrRoleRequirements(SystemUnitClassType ie, string classPath) - { - // HACK (MIHO, 2020-08-03): see equivalent function in AmlImport.cs; may be re-use - if (ie is InternalElementType) - if (CheckForRole((ie as InternalElementType).RoleRequirements, classPath)) - return true; - - return - CheckForRole(ie.SupportedRoleClass, classPath); - } - - public static bool CheckAttributeFoRefSemantic(AttributeType a, string correspondingAttributePath) - { - if (a.RefSemantic != null) - foreach (var rf in a.RefSemantic) - if (rf.CorrespondingAttributePath != null && rf.CorrespondingAttributePath.Trim() != "" - && rf.CorrespondingAttributePath.Trim().ToLower() - == correspondingAttributePath.Trim().ToLower()) - // found! - return true; - return false; - } - - public static AttributeType FindAttributeByRefSemantic( - AttributeSequence aseq, string correspondingAttributePath) - { - foreach (var a in aseq) - { - // check attribute itself - if (CheckAttributeFoRefSemantic(a, correspondingAttributePath)) - // found! - return a; - - // could be childs - var x = FindAttributeByRefSemantic(a.Attribute, correspondingAttributePath); - if (x != null) - return x; - } - return null; - } - - public static string FindAttributeValueByRefSemantic( - AttributeSequence aseq, string correspondingAttributePath) - { - var a = FindAttributeByRefSemantic(aseq, correspondingAttributePath); - return a?.Value; - } - - public static AttributeType FindAttributeByName(AttributeSequence aseq, string name) - { - if (aseq != null) - foreach (var a in aseq) - if (a.Name.Trim() == name.Trim()) - return a; - return null; - } - - public static string FindAttributeValueByName(AttributeSequence aseq, string name) - { - var a = FindAttributeByName(aseq, name); - return a?.Value; - } - - public static Nullable FindAttributeValueByNameFromInt(AttributeSequence aseq, string name) - { - var astr = FindAttributeValueByName(aseq, name); - if (astr == null) - return (null); - return Convert.ToInt32(astr); - } - - public static Nullable FindAttributeValueByNameFromDouble(AttributeSequence aseq, string name) - { - var astr = FindAttributeValueByName(aseq, name); - if (astr == null) - return (null); - if (!double.TryParse(astr, NumberStyles.Any, CultureInfo.InvariantCulture, out var res)) - return null; - return res; - } - - public static List> FindAllMtpPictures(CAEXFileType aml) - { - // start - var res = new List>(); - - // assumption: all pictures are on the 1st level of a instance hierarchy .. - foreach (var ih in aml.InstanceHierarchy) - foreach (var ie in ih.InternalElement) - if (ie.RefBaseSystemUnitPath.Trim() == "MTPHMISUCLib/Picture") - res.Add(new Tuple(ie.Name, ie)); - - // ok - return res; - } - - public static Dictionary FindAllDynamicInstances(CAEXFileType aml) - { - // start - var res = new Dictionary(StringComparer.InvariantCultureIgnoreCase); - if (aml == null) - return res; - - // assumption: all instances are on a fixed level of a instance hierarchy .. - foreach (var ih in aml.InstanceHierarchy) // e.g.: ModuleTypePackage - foreach (var ie in ih.InternalElement) // e.g. Class = ModuleTypePackage - foreach (var ie2 in ie.InternalElement) // e.g. CommunicationSet - foreach (var ie3 in ie2.InternalElement) // e.g. InstanceList - if (ie3.RefBaseSystemUnitPath.Trim() == "MTPSUCLib/CommunicationSet/InstanceList") - foreach (var ie4 in ie3.InternalElement) // now ALWAYS an dynamic instance - { - var refID = MtpAmlHelper.FindAttributeValueByName(ie4.Attribute, "RefID"); - if (refID != null && refID.Length > 0) - res.Add(refID, ie4); - } - - // ok - return res; - } - - public static void CreateDataSources( - IMtpDataSourceFactoryOpcUa dataSourceFactory, - MtpDataSourceOpcUaPreLoadInfo preLoadInfo, - CAEXFileType aml) - { - // access - if (dataSourceFactory == null || aml == null) - return; - - // assumption: all instances are on a fixed level of a instance hierarchy .. - foreach (var ih in aml.InstanceHierarchy) // e.g.: ModuleTypePackage - foreach (var ie in ih.InternalElement) // e.g. Class = ModuleTypePackage - foreach (var ie2 in ie.InternalElement) // e.g. CommunicationSet - foreach (var ie3 in ie2.InternalElement) // e.g. InstanceList - if (ie3.RefBaseSystemUnitPath.Trim() == "MTPSUCLib/CommunicationSet/SourceList") - foreach (var server in ie3.InternalElement) // now on server - { - // check if server valid - if (server.RefBaseSystemUnitPath.Trim() != - "MTPCommunicationSUCLib/ServerAssembly/OPCUAServer") - continue; - if (!server.Name.HasContent()) - continue; - - // get attributes - var ep = FindAttributeValueByName(server.Attribute, "Endpoint"); - - // mapping?? - if (preLoadInfo?.EndpointMapping != null) - foreach (var epm in preLoadInfo.EndpointMapping) - if (epm?.IsValid == true && - (server.Name.Trim() == epm.ForName?.Trim() - || server.ID.Trim() == epm.ForId?.Trim())) - { - ep = epm.NewEndpoint?.Trim(); - } - - // check endpoint - if (!ep.HasContent()) - continue; - - // make server - var serv = dataSourceFactory.CreateOrUseUaServer(ep); - if (serv == null) - continue; - - // go into items - foreach (var item in server.ExternalInterface) - { - // check to item - // TODO (MIHO, 2020-08-06): spec/example files seem not to be in a final state - // check for the final role/class names to be used - if (!item.RefBaseClassPath.Trim().Contains("OPCUAItem")) - continue; - - // get attributes - var id = FindAttributeValueByName(item.Attribute, "Identifier"); - var ns = FindAttributeValueByName(item.Attribute, "Namespace"); - var ac = FindAttributeValueByName(item.Attribute, "Access"); - - // potential renaming? - if (preLoadInfo?.IdentifierRenaming != null) - foreach (var ren in preLoadInfo.IdentifierRenaming) - id = ren.DoReplacement(id); - - if (preLoadInfo?.NamespaceRenaming != null) - foreach (var ren in preLoadInfo.NamespaceRenaming) - ns = ren.DoReplacement(ns); - - // create - // ReSharper disable once UnusedVariable - var it = dataSourceFactory.CreateOrUseItem(serv, id, ns, ac, item.ID); - } - } - - } - - public static double[] ConvertStringToDoubleArray(string input, char[] separator) - { - var pieces = input.Split(separator, StringSplitOptions.RemoveEmptyEntries); - // ReSharper disable once ConditionIsAlwaysTrueOrFalse - if (pieces == null) - // ReSharper disable once HeuristicUnreachableCode - return null; - var res = new List(); - foreach (var p in pieces) - { - if (!double.TryParse(p.Trim(), NumberStyles.Any, CultureInfo.InvariantCulture, out var num)) - // fail immediately - return null; - res.Add(num); - } - return res.ToArray(); - } - - /// - /// Edges delimited by ';', coordinates by ','. Example: "1,2;3,4;5,6". - /// - public static PointCollection PointCollectionFromString(string edgepath) - { - var edges = edgepath.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); - // ReSharper disable once ConditionIsAlwaysTrueOrFalse - if (edges == null || edges.Length < 2) - return null; - - var pc = new PointCollection(); - foreach (var e in edges) - { - var coord = ConvertStringToDoubleArray(e, new[] { ',' }); - if (coord != null && coord.Length == 2) - pc.Add(new Point(coord[0], coord[1])); - } - return pc; - } - - } -} diff --git a/src/WpfMtpControl/MtpData.cs b/src/WpfMtpControl/MtpData.cs deleted file mode 100644 index fce2e3b5e..000000000 --- a/src/WpfMtpControl/MtpData.cs +++ /dev/null @@ -1,408 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.Compression; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Media; -using Aml.Engine.CAEX; -using Mtp.DynamicInstances; -using WpfMtpControl.DataSources; - -namespace WpfMtpControl -{ - public class MtpData - { - public Dictionary PictureCollection = new Dictionary(); - - public class MtpBaseObject - { - public string Name = ""; - public string RefID = null; - public int ObjClass = 0; - } - - public class MtpConnectionObject : MtpBaseObject - { - public PointCollection points = null; - } - - public class MtpPortedObject : MtpBaseObject - { - public PointCollection logicalPorts = null, nozzlePoints = null, measurementPoints = null; - } - - public class MtpVisualObject : MtpPortedObject - { - public double? x, y, width, height, rotation; - public string viewType, eVer, eClass, eIrdi, refID; - - public MtpVisualObjectRecord visObj = null; - - public MtpDynamicInstanceBase dynInstance = null; - - public void Parse(InternalElementType ie) - { - x = MtpAmlHelper.FindAttributeValueByNameFromDouble(ie.Attribute, "X"); - y = MtpAmlHelper.FindAttributeValueByNameFromDouble(ie.Attribute, "Y"); - width = MtpAmlHelper.FindAttributeValueByNameFromDouble(ie.Attribute, "Width"); - height = MtpAmlHelper.FindAttributeValueByNameFromDouble(ie.Attribute, "Height"); - rotation = MtpAmlHelper.FindAttributeValueByNameFromDouble(ie.Attribute, "Rotation"); - viewType = MtpAmlHelper.FindAttributeValueByName(ie.Attribute, "ViewType"); - eVer = MtpAmlHelper.FindAttributeValueByName(ie.Attribute, "eClassVersion"); - eClass = MtpAmlHelper.FindAttributeValueByName(ie.Attribute, "eClassClassificationClass"); - eIrdi = MtpAmlHelper.FindAttributeValueByName(ie.Attribute, "eClassIRDI"); - refID = MtpAmlHelper.FindAttributeValueByName(ie.Attribute, "RefID"); - } - - public bool IsValid() - { - // because of PxC temporarily disable check eVer == null - if (x == null || y == null || width == null || height == null - || (eClass == null && eIrdi == null)) - return false; - return true; - } - } - - public class MtpTopologyObject : MtpPortedObject - { - public double? x, y; - public string refID; - - public MtpVisualObjectRecord visObj = null; - - public void Parse(InternalElementType ie) - { - x = MtpAmlHelper.FindAttributeValueByNameFromDouble(ie.Attribute, "X"); - y = MtpAmlHelper.FindAttributeValueByNameFromDouble(ie.Attribute, "Y"); - refID = MtpAmlHelper.FindAttributeValueByName(ie.Attribute, "RefID"); - } - - public bool IsValid() - { - if (x == null || y == null) - return false; - return true; - } - } - - public class MtpPicture - { - public string Name = ""; - public SystemUnitClassType Picture = null; - - public Size TotalSize = new Size(0, 0); - - public List Objects = new List(); - - public static MtpPicture ParsePicture( - MtpVisualObjectLib objectLib, - MtpDataSourceSubscriber subscriber, - Dictionary refIdToDynamicInstance, - SystemUnitClassType picture, - MtpSymbolMapRecordList makeUpConfigRecs = null) - { - // result - var res = new MtpPicture(); - res.Picture = picture; - - // first, set up the canvas - if (true) - { - var width = MtpAmlHelper.FindAttributeValueByNameFromDouble(picture.Attribute, "Width"); - var height = MtpAmlHelper.FindAttributeValueByNameFromDouble(picture.Attribute, "Height"); - if (width == null || height == null || width < 1 || height < 1) - return null; - res.TotalSize = new Size(width.Value, height.Value); - } - - // assume, that the elements below are in a list - foreach (var ie in picture.InternalElement) - { - // the check described in VDI2658 rely on RefBaseSystemUnitPath - if (ie == null || ie.Name == null || ie.RefBaseSystemUnitPath == null) - continue; - - var refID = MtpAmlHelper.FindAttributeValueByName(ie.Attribute, "RefID"); - - // do a classification based on numbers to easily comapre - var ec = 0; - if (ie.RefBaseSystemUnitPath.Trim() == "MTPHMISUCLib/Connection/Pipe") ec = 100; - if (ie.RefBaseSystemUnitPath.Trim() == "MTPHMISUCLib/Connection/FunctionLine") ec = 101; - if (ie.RefBaseSystemUnitPath.Trim() == "MTPHMISUCLib/Connection/MeasurementLine") ec = 102; - if (ie.RefBaseSystemUnitPath.Trim() == "MTPHMISUCLib/VisualObject") ec = 200; - if (ie.RefBaseSystemUnitPath.Trim() == "MTPHMISUCLib/TopologyObject/Termination/Nozzle") ec = 300; - if (ie.RefBaseSystemUnitPath.Trim() == "MTPHMISUCLib/TopologyObject/Termination/Source") ec = 301; - if (ie.RefBaseSystemUnitPath.Trim() == "MTPHMISUCLib/TopologyObject/Termination/Sink") ec = 302; - - // - // Pipe, FunctionLine, MeasurementLine - // - if (ec >= 100 && ec <= 199) - { - // access (still string) information - var edgepath = MtpAmlHelper.FindAttributeValueByName(ie.Attribute, "Edgepath"); - if (edgepath == null) - continue; - var points = MtpAmlHelper.PointCollectionFromString(edgepath); - if (points == null || points.Count < 2) - continue; - - var co = new MtpConnectionObject(); - co.Name = ie.Name; - co.RefID = refID; - co.ObjClass = ec; - co.points = points; - res.Objects.Add(co); - } - - // - // Nozzle information? - // - var nozzlePoints = new PointCollection(); - var measurementPoints = new PointCollection(); - // ReSharper disable once ConditionIsAlwaysTrueOrFalse - if (ec >= 200 && ec <= 399) - { - foreach (var ie2 in ie.InternalElement) - { - if (ie2 != null - && ie2.RefBaseSystemUnitPath?.Trim() == "MTPHMISUCLib/PortObject/Nozzle") - { - // found nozzle with valid information? - var nx = MtpAmlHelper.FindAttributeValueByNameFromDouble(ie2.Attribute, "X"); - var ny = MtpAmlHelper.FindAttributeValueByNameFromDouble(ie2.Attribute, "Y"); - if (nx != null && ny != null) - // add - nozzlePoints.Add(new Point(nx.Value, ny.Value)); - } - - if (ie2 != null - && ie2.RefBaseSystemUnitPath?.Trim() == "MTPHMISUCLib/PortObject/MeasurementPoint") - { - // found measurement point with valid information? - var nx = MtpAmlHelper.FindAttributeValueByNameFromDouble(ie2.Attribute, "X"); - var ny = MtpAmlHelper.FindAttributeValueByNameFromDouble(ie2.Attribute, "Y"); - if (nx != null && ny != null) - // add - measurementPoints.Add(new Point(nx.Value, ny.Value)); - } - } - } - - if (ie.Name == "V001") - { - ; - } - - // - // VisualObject - // - if (ec >= 200 && ec <= 299) - { - // create object and parse - var vo = new MtpVisualObject(); - vo.Name = ie.Name; - vo.RefID = refID; - vo.ObjClass = ec; - vo.Parse(ie); - if (!vo.IsValid()) - continue; - res.Objects.Add(vo); - - // add ports - vo.logicalPorts = null; - vo.measurementPoints = measurementPoints; - vo.nozzlePoints = nozzlePoints; - - // try find an XAML object - vo.visObj = objectLib.FindVisualObjectByClass(vo.eVer, vo.eClass, vo.eIrdi); - - // help improving this search - if (makeUpConfigRecs != null) - { - makeUpConfigRecs.Add(new MtpSymbolMapRecord( - vo.eVer, vo.eClass, vo.eIrdi, SymbolDefault: "{to be set}", - Comment: "" + vo.Name + "," + vo.RefID)); - } - - // try find dynamic instances - if (vo.refID != null && refIdToDynamicInstance != null - && refIdToDynamicInstance.ContainsKey(vo.refID)) - { - // try get the dynamic instance - var ieDI = refIdToDynamicInstance[vo.refID] as InternalElementType; - - if (ieDI != null && ieDI.RefBaseSystemUnitPath != null - && ieDI.RefBaseSystemUnitPath.Trim().Length > 0) - { - var bsup = ieDI.RefBaseSystemUnitPath.Trim(); - - if (bsup == "MTPDataObjectSUCLib/DataAssembly/AnaView" - || bsup == "MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView") - vo.dynInstance = new MtpDiAnaView(); - if (bsup == "MTPDataObjectSUCLib/DataAssembly/AnaView/AnaMon" - || bsup == "MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView/AnaMon") - vo.dynInstance = new MtpDiAnaMon(); - - if (bsup == "MTPDataObjectSUCLib/DataAssembly/DIntiew" - || bsup == "MTPDataObjectSUCLib/DataAssembly/IndicatorElement/DIntView") - vo.dynInstance = new MtpDiDIntView(); - if (bsup == "MTPDataObjectSUCLib/DataAssembly/AnaView/DIntMon" - || bsup == "MTPDataObjectSUCLib/DataAssembly/IndicatorElement/AnaView/DIntMon") - vo.dynInstance = new MtpDiDIntMon(); - - if (bsup == "MTPDataObjectSUCLib/DataAssembly/BinView" - || bsup == "MTPDataObjectSUCLib/DataAssembly/IndicatorElement/BinView") - vo.dynInstance = new MtpDiBinView(); - - if (bsup == "MTPDataObjectSUCLib/DataAssembly/BinMon" - || bsup == "MTPDataObjectSUCLib/DataAssembly/IndicatorElement/BinMon") - vo.dynInstance = new MtpDiBinMon(); - - if (bsup == "MTPDataObjectSUCLib/DataAssembly/BinVlv") - vo.dynInstance = new MtpDiBinValve(); - if (bsup == "MTPDataObjectSUCLib/DataAssembly/MonBinVlv") - vo.dynInstance = new MtpDiMonBinValve(); - - if (bsup == "MTPDataObjectSUCLib/DataAssembly/BinDrv") - vo.dynInstance = new MtpDiBinDrive(); - - if (bsup == "MTPDataObjectSUCLib/DataAssembly/ActiveElement/PIDCtrl") - vo.dynInstance = new MtpDiPIDCntl(); - } - - // found? - if (vo.dynInstance != null) - { - vo.dynInstance.PopulateFromAml(ie.Name, ieDI, subscriber); - } - } - } - - // - // Topology Object - // - // ReSharper disable once ConditionIsAlwaysTrueOrFalse - if (ec >= 300 && ec <= 309) - { - // create object and parse - var to = new MtpTopologyObject(); - to.Name = ie.Name; - to.RefID = refID; - to.ObjClass = ec; - to.Parse(ie); - if (!to.IsValid()) - continue; - res.Objects.Add(to); - - // add ports - to.logicalPorts = null; - to.measurementPoints = measurementPoints; - to.nozzlePoints = nozzlePoints; - - // draw source / sink? - // ReSharper disable once ConditionIsAlwaysTrueOrFalse - if (ec >= 301 && ec <= 302) - { - // get visual object - to.visObj = objectLib.FindVisualObjectByName( - new[] { "Source_general", "Sink_general" }[ec - 301]); - } - } - } - - // return picture - return res; - } - } - - public void LoadStream( - MtpVisualObjectLib objectLib, IMtpDataSourceFactoryOpcUa dataSourceFactory, - MtpDataSourceOpcUaPreLoadInfo preLoadInfo, - MtpDataSourceSubscriber subscriber, Stream stream, - MtpSymbolMapRecordList makeUpConfigRecs = null) - { - // check - if (stream == null) - return; - - // try open file - var doc = CAEXDocument.LoadFromStream(stream); - if (doc == null) - return; - - // load dynamic Instances - var refIdToDynamicInstance = MtpAmlHelper.FindAllDynamicInstances(doc.CAEXFile); - - // load data sources - if (dataSourceFactory != null) - MtpAmlHelper.CreateDataSources(dataSourceFactory, preLoadInfo, doc.CAEXFile); - - // index pictures - var pl = MtpAmlHelper.FindAllMtpPictures(doc.CAEXFile); - foreach (var pi in pl) - { - var p = MtpPicture.ParsePicture(objectLib, subscriber, refIdToDynamicInstance, - pi.Item2, makeUpConfigRecs); - if (p != null) - this.PictureCollection.Add(pi.Item1, p); - } - } - - public void LoadAmlOrMtp( - MtpVisualObjectLib objectLib, IMtpDataSourceFactoryOpcUa dataSourceFactory, - MtpDataSourceOpcUaPreLoadInfo preLoadInfo, - MtpDataSourceSubscriber subscriber, string fn, - MtpSymbolMapRecordList makeUpConfigRecs = null) - { - // check - if (fn == null) - return; - - // check if we have a mtp-file, which needs to be unzipped - bool unzip = fn.ToLower().EndsWith(".mtp") || fn.ToLower().EndsWith(".zip"); - - // easy? - if (!unzip) - { - using (var stream = File.OpenRead(fn)) - { - LoadStream(objectLib, dataSourceFactory, preLoadInfo, subscriber, stream, makeUpConfigRecs); - } - return; - } - - // not easy .. - using (var file = File.OpenRead(fn)) - using (var zip = new ZipArchive(file, ZipArchiveMode.Read)) - { - // simply take the first .aml file - foreach (var entry in zip.Entries) - { - // take the 1st *.anl file; should be only one on the root level, even for MultiFileMTP - if (entry.FullName.ToLower().EndsWith(".aml")) - { - using (var stream = entry.Open()) - { - LoadStream(objectLib, dataSourceFactory, preLoadInfo, subscriber, stream, makeUpConfigRecs); - } - break; - } - } - } - } - } -} diff --git a/src/WpfMtpControl/MtpDataSourceSubscriber.cs b/src/WpfMtpControl/MtpDataSourceSubscriber.cs deleted file mode 100644 index d68f46b66..000000000 --- a/src/WpfMtpControl/MtpDataSourceSubscriber.cs +++ /dev/null @@ -1,85 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace WpfMtpControl -{ - public class MtpDataSourceSubscriber - { - public enum ChangeType { Value } - - public class SubscriberItem - { - public string DataSourceItemId = null; - public Type ConvertToType = null; - public Action ActionLambda = null; - } - - private Dictionary items = new Dictionary(); - - public void Subscribe(string dataSourceItemId, Action action) - { - if (items.ContainsKey(dataSourceItemId)) - items.Remove(dataSourceItemId); - - var si = new SubscriberItem(); - si.DataSourceItemId = dataSourceItemId; - si.ConvertToType = typeof(T); - si.ActionLambda = action; - - items[dataSourceItemId] = si; - } - - public void SubscribeToAmlIdRefWith( - Aml.Engine.CAEX.AttributeSequence aseq, string attrName, Action action) - { - var idRef = MtpAmlHelper.FindAttributeValueByName(aseq, attrName); - if (idRef != null && idRef.Length > 0) - this.Subscribe(idRef, action); - } - - public void Invoke(string dataSourceItemId, ChangeType change, object o) - { - if (items.ContainsKey(dataSourceItemId)) - { - var si = items[dataSourceItemId]; - if (si != null) - { - // try to convert? - try - { - if (si.ConvertToType == typeof(double)) - o = Convert.ToDouble(o); - if (si.ConvertToType == typeof(float)) - o = Convert.ToSingle(o); - if (si.ConvertToType == typeof(int)) - o = Convert.ToInt32(o); - if (si.ConvertToType == typeof(uint)) - o = Convert.ToUInt32(o); - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); - - // on any error, simply do not call lambda - return; - } - - if (si.ActionLambda != null) - si.ActionLambda(change, o); - } - } - } - } -} diff --git a/src/WpfMtpControl/MtpSymbolLib.cs b/src/WpfMtpControl/MtpSymbolLib.cs deleted file mode 100644 index 5605568ee..000000000 --- a/src/WpfMtpControl/MtpSymbolLib.cs +++ /dev/null @@ -1,162 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; - -namespace WpfMtpControl -{ - public class MtpSymbol - { - /// - /// Different strategies of dealing with a geometric object - /// - public enum SymbolPlaceType { StretchToBoundingBox, FitNozzles } - - /// - /// Symbolic name / ID of the library, as given by static initialization of the symbol lib - /// - public string LibName = ""; - - /// - /// Symbolic name of the symbol, as derived from the Xaml.Key property - /// - public string SymbolName = ""; - - /// - /// Getter for the full name, composed from LibName and "." and SymbolName - /// - public string FullName { get { return LibName + "." + SymbolName; } } - - /// - /// Preffered placement type - /// - public SymbolPlaceType PreferredPlacement = SymbolPlaceType.StretchToBoundingBox; - - /// - /// Preferred label alignment - /// - public UIElementHelper.DrawToCanvasAlignment PreferredLabelAlignment - = UIElementHelper.DrawToCanvasAlignment.Centered; - - /// - /// Object data of the symbol, expected to be XAML Canvas element. - /// - /// - private object symbolData = null; - public object SymbolData - { - get { return this.symbolData; } - set { this.SetSymbol(value); } - } - - // - // Constructors - // - - public MtpSymbol() { } - - public MtpSymbol(string LibName, string SymbolName, object Symbol) - { - this.LibName = LibName; - this.SymbolName = SymbolName; - this.SymbolData = Symbol; - } - - public MtpSymbol(MtpSymbol other) - { - this.LibName = "" + other?.LibName; - this.SymbolName = "" + other?.SymbolName; - this.SymbolData = other?.SymbolData; - } - - public MtpSymbol(string LibName, ResourceDictionary rd, string SymbolName) - { - this.LibName = LibName; - this.SymbolName = SymbolName; - this.SymbolData = rd[SymbolName]; - } - - // - // Evaluation of derived properties - // - - /// - /// Nozzle positions found in the XAML shape - /// - public Point[] NozzlePos = null; - - /// - /// Found label positions for the shape. Top=0, Right=1, Bottom=2, Left=3 - /// - public Point[] LabelPos = null; - - public void SetSymbol(object XamlContent) - { - // assume to be a canvas - var canvasContent = XamlContent as Canvas; - if (canvasContent == null) - return; - - // clone the canvas, as later accessing functionality shall not see Nozzles, Labels artifiacts in XAML - var clonedCanvas = UIElementHelper.cloneElement(canvasContent) as Canvas; - if (clonedCanvas == null) - return; - - // remember this as Symbol! - this.symbolData = clonedCanvas; - - // find named nozzles and remove artifacts! - this.NozzlePos = UIElementHelper.FindNozzlesViaTags(clonedCanvas, "Nozzle", extractShapes: true); - - // find label positions and remove artifacts! - this.LabelPos = UIElementHelper.FindNozzlesViaTags(clonedCanvas, "Label", extractShapes: true); - } - } - - public class MtpSymbolLib : Dictionary - { - public object GetSymbol(string Fullname) - { - if (this.ContainsKey(Fullname)) - return this[Fullname].SymbolData; - return null; - } - - public void ImportResourceDicrectory(string LibName, ResourceDictionary rd) - { - // access - if (rd == null) - return; - - // over all - foreach (var key in rd.Keys) - { - // only take Canvas as symbol root element - if (rd[key] is Canvas) - { - // symbol - var sym = new MtpSymbol(LibName, rd, "" + key); - - // use name to figure out some options - if (("" + key).ToLower().Contains("nozzled")) - sym.PreferredPlacement = MtpSymbol.SymbolPlaceType.FitNozzles; - - // add - this.Add(sym.FullName, sym); - } - } - } - } -} diff --git a/src/WpfMtpControl/MtpVisuOpcUaClient.cs b/src/WpfMtpControl/MtpVisuOpcUaClient.cs deleted file mode 100644 index cf8b11f9b..000000000 --- a/src/WpfMtpControl/MtpVisuOpcUaClient.cs +++ /dev/null @@ -1,312 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using WpfMtpControl.DataSources; - -namespace WpfMtpControl -{ - /// - /// Simple client, implementing the Interface IMtpDataSourceOpcUaFactory and all necessary details - /// - public class MtpVisuOpcUaClient : IMtpDataSourceFactoryOpcUa, IMtpDataSourceStatus - { - public enum ItemChangeType { Value } - public delegate void ItemChangedDelegate( - IMtpDataSourceStatus dataSource, DetailItem itemRef, ItemChangeType changeType); - public event ItemChangedDelegate ItemChanged = null; - - public ObservableCollection Items = new ObservableCollection(); - - // ReSharper disable once ClassWithVirtualMembersNeverInherited.Global - public class DetailItem : MtpDataSourceOpcUaItem, IEquatable, INotifyPropertyChanged - { - public event PropertyChangedEventHandler PropertyChanged; - - protected virtual void OnPropertyChanged(string propertyName) - { - var handler = PropertyChanged; - if (handler != null) - handler(this, new PropertyChangedEventArgs(propertyName)); - } - - public DetailServer Server = null; - - public Opc.Ua.NodeId nid = null; - - public bool Equals(DetailItem other) - { - if (other == null || this.Server == null || other.Server == null) - return false; - - return this.Server == other.Server - && this.Identifier == other.Identifier - && this.Namespace == other.Namespace - && this.Access == other.Access; - } - - public string DisplayEndpoint { get { return "" + this.Server?.Endpoint; } } - public string DisplayNamespace { get { return "" + this.Namespace; } } - public string DisplayIdentifier { get { return "" + this.Identifier; } } - - public bool ValueTouched = true; - public object Value = null; - - private string displayValue = null; - public string DisplayValue - { - get { return displayValue; } - set { displayValue = value; OnPropertyChanged("DisplayValue"); } - } - } - - public class DetailServer : DataSources.MtpDataSourceOpcUaServer, IEquatable - { - MtpVisuOpcUaClient ParentRef = null; - - public int msToNextState = 3000; - public int state = 0; - - public List ItemRefs = new List(); - - public Dictionary nodeIdToItemRef = new Dictionary(); - - private AasOpcUaClient uaClient = null; - public AasOpcUaClient UaClient { get { return uaClient; } } - - public DetailServer(MtpVisuOpcUaClient parentRef) - { - this.ParentRef = parentRef; - } - - public void Tick(int ms) - { - // next state? - msToNextState -= ms; - if (msToNextState < 0) - { - msToNextState = 3000; - var nextState = -1; - - // starting server - if (state == 0) - { - // try to initialize OPC UA server - this.uaClient = new AasOpcUaClient( - this.Endpoint, _autoAccept: true, _stopTimeout: 10, _userName: this.User, - _password: this.Password); - this.uaClient.Run(); - // go on for a checking state - nextState = 1; - } - - // starting subscription - if (state == 1) - { - // good connection - if (this.uaClient != null && this.uaClient.StatusCode == AasOpcUaClientStatus.Running) - { - // add subscriptions for all nodes - var nids = new List(); - foreach (var ir in this.ItemRefs) - { - ir.DisplayValue = null; - try - { - // make node id? - ir.nid = this.uaClient.CreateNodeId(ir.Identifier, ir.Namespace); - if (ir.nid == null) - continue; - - // inital read possible? - var dv = this.uaClient.ReadNodeId(ir.nid); - ir.DisplayValue = "" + dv.Value; - ir.Value = dv.Value; - - // send event - if (this.ParentRef?.ItemChanged != null) - this.ParentRef.ItemChanged.Invoke(this.ParentRef, ir, ItemChangeType.Value); - - // try subscribe! - nids.Add(ir.nid); - this.nodeIdToItemRef.Add(ir.nid, ir); - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); - } - } - - // try add these - this.uaClient.SubscribeNodeIds(nids.ToArray(), OnNotification, publishingInteral: 200); - - // go on - nextState = 2; - } - } - - // stable running - if (state == 2) - { - ; - } - - // move? - if (nextState >= 0) - this.state = nextState; - } - } - - private void OnNotification( - Opc.Ua.Client.MonitoredItem item, Opc.Ua.Client.MonitoredItemNotificationEventArgs e) - { - foreach (var value in item.DequeueValues()) - { - if (this.nodeIdToItemRef != null && this.nodeIdToItemRef.ContainsKey(item.StartNodeId)) - { - // get item ref - var ir = this.nodeIdToItemRef[item.StartNodeId]; - - // change data (and notify ObservableCollection) - ir.DisplayValue = "" + value.Value; - ir.Value = value.Value; - ir.ValueTouched = true; - - // business logic event - if (this.ParentRef?.ItemChanged != null) - this.ParentRef.ItemChanged.Invoke(this.ParentRef, ir, ItemChangeType.Value); - } - } - } - - public bool Equals(DetailServer other) - { - if (other == null) - return false; - - return this.Endpoint == other.Endpoint; - } - } - - private List servers = new List(); - - // - // Interface: IMtpDataSourceFactoryOpcUa - // - - public MtpDataSourceOpcUaServer CreateOrUseUaServer(string Endpoint, bool allowReUse = false) - { - if (Endpoint == null) - return null; - - // make one - var s = new DetailServer(this); - s.Endpoint = Endpoint; - - // or try re-use? - var doAdd = true; - if (allowReUse && servers.Contains(s)) - { - s = servers.Find(x => x.Equals(s)); - doAdd = false; - } - - // add? - if (doAdd) - servers.Add(s); - return s; - } - - public MtpDataSourceOpcUaItem CreateOrUseItem( - MtpDataSourceOpcUaServer server, - string Identifier, string Namespace, string Access, string mtpSourceItemId, - bool allowReUse = false) - { - // need server - if (!servers.Contains(server) || Identifier == null || Namespace == null || Access == null) - return null; - var ds = (server as DetailServer); - - // TODO (MIHO, 2020-08-06): remove this, if not required anymore - var allowedIds = new[] { "L001", "L002", "L003", "F001", "M001", "V001", "V002", "V003", "P001" }; - var allowedFound = false; - foreach (var ai in allowedIds) - if (Identifier.Contains("." + ai + ".")) - allowedFound = true; - if (!allowedFound) - return null; - - // directly use server - var i = new DetailItem(); - i.Server = ds; - i.Identifier = Identifier; - i.Namespace = Namespace; - i.Access = MtpDataSourceOpcUaItem.AccessType.ReadWrite; - i.MtpSourceItemId = mtpSourceItemId; - - // try re-use? - var doAdd = true; - if (allowReUse && this.Items.Contains(i)) - { - foreach (var it in this.Items) - if (it.Equals(i)) - { - i = it; - break; - } - doAdd = false; - } - - // add? - if (doAdd) - { - this.Items.Add(i); - ds?.ItemRefs.Add(i); - } - return i; - } - - public void Tick(int ms) - { - foreach (var s in this.servers) - s.Tick(ms); - } - - // - // Interface IMtpDataSourceStatus - // - - public string GetStatus() - { - var numit = this.Items.Count; - // ReSharper disable once NotAccessedVariable - var servinfo = ""; - var i = 0; - foreach (var s in this.servers) - { - servinfo += $"(se={i} st={s.state} t={s.msToNextState,5}ms, " + - $"code={"" + s.UaClient?.StatusCode.ToString()}) "; - i++; - } - return $"{this.servers.Count} servers, {numit} items | {servinfo}"; - } - - public void ViewDetails() - { - ; - } - - } -} diff --git a/src/WpfMtpControl/MtpVisuOptions.cs b/src/WpfMtpControl/MtpVisuOptions.cs deleted file mode 100644 index a8323b318..000000000 --- a/src/WpfMtpControl/MtpVisuOptions.cs +++ /dev/null @@ -1,77 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Media; -using AasxIntegrationBase; -using Newtonsoft.Json; - -namespace WpfMtpControl -{ - public class MtpVisuOptions - { - // original input - - public string Background = "#e0e0e0"; - - public string StateColorActive = "#0000ff"; - public string StateColorNonActive = "#000000"; - - public string StateColorForward = "#0000ff"; - public string StateColorReverse = "#00ff00"; - - // prepared - - [JsonIgnore] - public Brush BackgroundBrush = new SolidColorBrush(Color.FromRgb(224, 224, 255)); - - [JsonIgnore] - public Brush StateColorActiveBrush = Brushes.Blue; - [JsonIgnore] - public Brush StateColorNonActiveBrush = Brushes.Black; - - [JsonIgnore] - public Brush StateColorForwardBrush = Brushes.Blue; - [JsonIgnore] - public Brush StateColorReverseBrush = Brushes.Green; - - private static void PrepareColor(string preset, ref Brush color) - { - // going mad about this .. - // ReSharper disable once ConditionIsAlwaysTrueOrFalse - // ReSharper disable once PossibleNullReferenceException - if (preset.HasContent()) - try - { - var c = (Color)ColorConverter.ConvertFromString(preset); - if (c != null) - color = new SolidColorBrush(c); - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); - } - } - - public void Prepare() - { - PrepareColor(this.Background, ref this.BackgroundBrush); - - PrepareColor(this.StateColorActive, ref this.StateColorActiveBrush); - PrepareColor(this.StateColorNonActive, ref this.StateColorNonActiveBrush); - - PrepareColor(this.StateColorForward, ref this.StateColorForwardBrush); - PrepareColor(this.StateColorReverse, ref this.StateColorReverseBrush); - } - } -} diff --git a/src/WpfMtpControl/MtpVisuViewer.xaml b/src/WpfMtpControl/MtpVisuViewer.xaml deleted file mode 100644 index 530427e01..000000000 --- a/src/WpfMtpControl/MtpVisuViewer.xaml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - Handle Points - Bounding Boxes - - - - - - - - - - - - - - - diff --git a/src/WpfMtpControl/MtpVisuViewer.xaml.cs b/src/WpfMtpControl/MtpVisuViewer.xaml.cs deleted file mode 100644 index 6a80456e3..000000000 --- a/src/WpfMtpControl/MtpVisuViewer.xaml.cs +++ /dev/null @@ -1,668 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Markup; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; -using System.Xml; -using Aml.Engine.CAEX; -using Mtp.DynamicInstances; -using WpfMtpControl.DataSources; -using static WpfMtpControl.MtpData; - -namespace WpfMtpControl -{ - public partial class MtpVisuViewer : UserControl - { - // - // External properties - // - - public delegate void MtpObjectDoubleClickHandler(MtpData.MtpBaseObject source); - public event MtpObjectDoubleClickHandler MtpObjectDoubleClick; - - public MtpVisuOptions VisuOptions = new MtpVisuOptions(); - - // - // Internal properties - // - - public MtpVisuViewer() - { - InitializeComponent(); - } - - private void Canvas_Loaded(object sender, RoutedEventArgs e) - { - // Timer for loading - System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer(); - dispatcherTimer.Tick += DispatcherTimer_Tick; - dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 100); - dispatcherTimer.Start(); - } - - public UIElementHelper.FontSettings LabelFontSettings = new UIElementHelper.FontSettings( - new FontFamily("Arial"), FontStyles.Normal, FontWeights.Normal, FontStretches.Condensed, 18.0); - - public void SetLineStyle(Shape l, int elementClass) - { - if (elementClass == 100) - { - } - if (elementClass == 101) - { - DoubleCollection dashes = new DoubleCollection(); - dashes.Add(2); - dashes.Add(2); - l.StrokeDashArray = dashes; - } - if (elementClass == 102) - { - DoubleCollection dashes = new DoubleCollection(); - dashes.Add(4); - dashes.Add(2); - dashes.Add(1); - dashes.Add(2); - l.StrokeDashArray = dashes; - } - } - - public Rectangle ConstructRect(Brush stroke, double strokeThickness, Brush fill = null) - { - var res = new Rectangle(); - res.Stroke = stroke; - res.StrokeThickness = strokeThickness; - if (fill != null) - res.Fill = fill; - return res; - } - - public Ellipse ConstructEllipse(Nullable strokeThickness = null, Brush stroke = null, Brush fill = null) - { - var res = new Ellipse(); - if (stroke != null) - res.Stroke = stroke; - if (strokeThickness != null) - res.StrokeThickness = strokeThickness.Value; - if (fill != null) - res.Fill = fill; - return res; - } - - public Canvas ConstructContentObject(MtpVisualObjectRecord xaml) - { - var contentObject = xaml?.Symbol?.SymbolData as Canvas; - contentObject = UIElementHelper.cloneElement(contentObject) as Canvas; - return contentObject; - } - - public Viewbox ConstructViewboxVO(FrameworkElement contentObject, double rotation) - { - // trivial - if (contentObject == null) - return null; - - // make such object - var viso = new ContentControl(); - viso.Content = contentObject; - - // rotation in degree, mathematically positive == anti clock wise - var rt = new RotateTransform(-rotation, contentObject.Width / 2, contentObject.Height / 2); - viso.RenderTransform = rt; - - var vb = new Viewbox(); - vb.Child = viso; - vb.Stretch = Stretch.Fill; - - // ok - return vb; - } - - public ContentControl ConstructDirectVO( - FrameworkElement contentObject, double scale, double rotation, Point center) - { - // trivial - // ReSharper disable once ConditionIsAlwaysTrueOrFalse - if (contentObject == null || center == null) - return null; - - // rotation in degree, mathematically positive == anti clock wise - var tg = new TransformGroup(); - tg.Children.Add(new RotateTransform(-rotation, center.X, center.Y)); - tg.Children.Add(new ScaleTransform(scale, scale, center.X, center.Y)); - // Note: the following was disabled by MIHO at same stage: - //// tg.Children.Add(new ScaleTransform(scale, scale, 0 - //// .0 * center.X + contentObject.Width / 2, 0.0 * center.Y + contentObject.Height / 2)); - contentObject.RenderTransform = tg; - - // make such object - var viso = new ContentControl(); - viso.Content = contentObject; - viso.Width = contentObject.Width; - viso.Height = contentObject.Height; - - // ok - return viso; - } - - public void DrawToCanvasAtPositionSize( - Canvas canvas, double x, double y, double width, double height, FrameworkElement fe) - { - if (canvas == null || fe == null) - return; - fe.Width = width; - fe.Height = height; - canvas.Children.Add(fe); - Canvas.SetLeft(fe, x); - Canvas.SetTop(fe, y); - } - - public void DrawHandlePoint(Canvas canvas, double x, double y, bool draw = true, Brush handleBrush = null) - { - if (!draw) - return; - var hb = (handleBrush == null) ? Brushes.Blue : handleBrush; - var p = ConstructEllipse(fill: hb); - DrawToCanvasAtPositionSize(canvas, x - 4.0, y - 4.0, 8.0, 8.0, p); - } - - public void DrawMtpPictureIntoCanvas( - Canvas canvas, MtpData.MtpPicture pic, - bool drawHandlePoints = true, bool drawBoundingBoxes = true) - { - // clear access - if (canvas == null || pic == null) - return; - canvas.Children.Clear(); - - // prepare options correctly - this.VisuOptions?.Prepare(); - - // for some tests, we need randomness -#if _only_testing - var rnd = new Random(); -#endif - // first, set up the canvas - if (true) - { - if (pic.TotalSize.Width < 1 || pic.TotalSize.Height < 1) - return; - canvas.Width = pic.TotalSize.Width; - canvas.Height = pic.TotalSize.Height; - - if (this.VisuOptions?.BackgroundBrush != null) - { - canvas.Background = this.VisuOptions.BackgroundBrush; - scrollViewerVisu.Background = this.VisuOptions.BackgroundBrush; - } - } - - // assume, that the elements below are in a list - foreach (var obj in pic.Objects) - { - // the check described in VDI2658 rely on RefBaseSystemUnitPath - if (obj == null || obj.Name == null) - continue; - - // - // Pipe, FunctionLine, MeasurementLine - // - if (obj is MtpData.MtpConnectionObject conn) - { - // make appropriate poly line - var l = new Polyline(); - l.Stroke = Brushes.Black; - l.StrokeThickness = 1; - l.Points = conn.points; - - // line style - SetLineStyle(l, obj.ObjClass); - - // draw - l.Tag = conn; - canvas.Children.Add(l); - } - - // - // VisualObject - // - if (obj is MtpData.MtpVisualObject vo) - { - // debug? - if (obj.Name == "V001") - { - ; - } - - // search - var symbol = vo?.visObj?.Symbol; - if (symbol?.SymbolData == null) - { - // make missing bounding box - if (drawBoundingBoxes && vo.x.HasValue && vo.y.HasValue - && vo.width.HasValue && vo.height.HasValue) - { - // box - DrawToCanvasAtPositionSize(canvas, vo.x.Value, vo.y.Value, vo.width.Value, - vo.height.Value, ConstructRect(Brushes.Red, 2.0)); - - // label? - var labeltb = UIElementHelper.CreateStickyLabel(this.LabelFontSettings, "" + vo.Name); - UIElementHelper.DrawToCanvasAtPositionAligned(canvas, - vo.x.Value + vo.width.Value / 2, - vo.y.Value + vo.height.Value / 2, - UIElementHelper.DrawToCanvasAlignment.Centered, labeltb); - } - - continue; - } - - // make a NEW content object to display & manipulate - var contentObject = symbol.SymbolData as Canvas; - if (contentObject == null) - continue; - - contentObject = UIElementHelper.cloneElement(contentObject) as Canvas; - - // delete not necessary artifacts in the XAML - UIElementHelper.FindNozzlesViaTags(contentObject, "Nozzle", extractShapes: true); - UIElementHelper.FindNozzlesViaTags(contentObject, "Label", extractShapes: true); - - // same logic for potential dynamic instance - var dynInstanceVO = vo.dynInstance?.CreateVisualObject(vo.width.Value, vo.height.Value); - - // - // how to draw content? - // - if (dynInstanceVO != null) - { - // draw an dynamic instance object - - // make bounding box Rect - if (drawBoundingBoxes) - DrawToCanvasAtPositionSize(canvas, vo.x.Value, vo.y.Value, vo.width.Value, - vo.height.Value, ConstructRect(Brushes.Violet, 1.0)); - - // draw it - var vb = ConstructViewboxVO(dynInstanceVO, 0.0 /* vo.rotation.Value */); - vb.Stretch = Stretch.Uniform; - vb.Tag = vo; - DrawToCanvasAtPositionSize(canvas, vo.x.Value, vo.y.Value, vo.width.Value, vo.height.Value, vb); - } - - if (vo.dynInstance == null || vo.dynInstance.DrawSymbolAsWell) - { - if (vo.visObj != null && contentObject != null) - { - // how to draw based on valid vis obj information - if (vo.visObj.Placement == MtpSymbol.SymbolPlaceType.FitNozzles && vo.nozzlePoints.Count > 0 - && symbol.NozzlePos != null && symbol.NozzlePos.Length > 0) - { - // magnetically snap in - // COG of "surrounding" nozzles, and distance - var npArr = vo.nozzlePoints.ToArray(); - var npCOG = UIElementHelper.ComputeCOG(npArr); - var npRadius = UIElementHelper.ComputeRadiusForCenterPointer(npArr, npCOG.Value); - - // COG of content nozzles, and distance - var contentCOG = UIElementHelper.ComputeCOG(symbol.NozzlePos); - var contentRadius = UIElementHelper.ComputeRadiusForCenterPointer( - symbol.NozzlePos, contentCOG.Value); - - // compute the delta between visual object's mid an its nozzle COG - var contentCogToMid = new Point( - contentCOG.Value.X - contentObject.Width / 2.0, - contentCOG.Value.Y - contentObject.Height / 2.0); - - if (npArr == null || npCOG == null || npRadius == null - || contentCOG == null || contentRadius == null) - continue; - - // based on the radius and COG information, construct a start vector - // FIX: radius could be 0! - var start = new UIElementHelper.Transformation2D( - (contentRadius.Value < 0.01) ? 1.0 : npRadius.Value / contentRadius.Value, - vo.rotation.Value, - npCOG.Value.X, npCOG.Value.Y - ); - - // disturb it? -#if _only_testing -#pragma warning disable 162 - // ReSharper disable once HeuristicUnreachableCode - { - // ReSharper disable once HeuristicUnreachableCode - start.Rot += -15.0 + 30.0 * rnd.NextDouble(); - start.Scale *= 0.8 + 0.4 * rnd.NextDouble(); - start.OfsX += -5.0 + 10.0 * rnd.NextDouble(); - start.OfsY += -5.0 + 10.0 * rnd.NextDouble(); - } -#pragma warning restore 162 -#endif - // improve it - var better = UIElementHelper.FindBestFitForFieldOfPoints( - symbol.NozzlePos, npArr, start, 0.3, 30.0, 10.0, 10, 3); - if (better != null) - start = better; - - // draw it - UIElementHelper.ApplyMultiLabel(contentObject, - new[] { - new Tuple("%TAG%", "" + vo.Name) - }); - - - if (obj.Name == "P001") - { - } - - var shape = ConstructDirectVO(contentObject, 1.0 * start.Scale, 1.0 * start.Rot, - contentCOG.Value); - shape.Width *= start.Scale; - shape.Height *= start.Scale; - - var sr = new Rect( - start.OfsX - shape.Width / 2, - start.OfsY - shape.Height / 2, - shape.Width, - shape.Height); - - if (drawBoundingBoxes) - DrawToCanvasAtPositionSize(canvas, sr.X, sr.Y, sr.Width, sr.Height, - ConstructRect(Brushes.Blue, 1.0)); - - // Correct position for drawing the shape for some IRRATIONAL offset and the delta - // between shape's mid and the COG of the nozzles - - sr.Location = new Point( - sr.X - 2.0 - contentCogToMid.X * start.Scale, - sr.Y - 2.0 - contentCogToMid.Y * start.Scale); - - // for debugging? - //// DrawHandlePoint(canvas, sr.X, sr.Y, drawHandlePoints); - - // draw - shape.Tag = vo; - shape.BorderThickness = new Thickness(2); - shape.BorderBrush = Brushes.Orange; - DrawToCanvasAtPositionSize(canvas, sr.X, sr.Y, sr.Width, sr.Height, shape); - - // register in dynInstance? - if (vo.dynInstance != null) - { - vo.dynInstance.SymbolElement = shape; - vo.dynInstance.RedrawSymbol(); - } - - // draw the label at mid of bounding box - var labeltb = UIElementHelper.CreateStickyLabel(this.LabelFontSettings, "" + vo.Name); - labeltb.Tag = vo; - UIElementHelper.DrawToCanvasAtPositionAligned(canvas, - vo.x.Value + vo.width.Value / 2, - vo.y.Value + vo.height.Value / 2, - UIElementHelper.TranslateRotToAlignemnt(start.Rot), labeltb); - - } - else - if (vo.visObj.Placement == MtpSymbol.SymbolPlaceType.StretchToBoundingBox) - { - // make bounding box Rect - if (drawBoundingBoxes) - DrawToCanvasAtPositionSize(canvas, - vo.x.Value, vo.y.Value, - vo.width.Value, vo.height.Value, ConstructRect(Brushes.Blue, 1.0)); - - // draw it - UIElementHelper.ApplyMultiLabel(contentObject, new[] { - new Tuple("%TAG%", "" + vo.Name) - }); - var vb = ConstructViewboxVO(contentObject, vo.rotation.Value); - vb.Tag = vo; - DrawToCanvasAtPositionSize(canvas, - vo.x.Value, vo.y.Value, - vo.width.Value, vo.height.Value, vb); - } - else - { - // right now, impossible! - } - } - else - { - // make missing part Rect - if (drawBoundingBoxes) - DrawToCanvasAtPositionSize(canvas, - vo.x.Value, vo.y.Value, - vo.width.Value, vo.height.Value, ConstructRect(Brushes.Red, 2.0)); - } - } - - // handle in the mid - DrawHandlePoint(canvas, - vo.x.Value + vo.width.Value / 2, vo.y.Value + vo.height.Value / 2, - drawHandlePoints); - } - - // - // Topology Object - // - if (obj is MtpData.MtpTopologyObject to) - { - // draw source / sink? - if (to.ObjClass >= 301 && to.ObjClass <= 302 && to.x != null && to.y != null) - { - // get visual object - var contentObject = ConstructContentObject(to.visObj); - UIElementHelper.ApplyMultiLabel(contentObject, new[] { - new Tuple("%TAG%", "" + to.Name) - }); - - if (to.visObj != null && contentObject != null) - { - // determine XY - // Note: still not knowing, if to use nozzle or measurement - Nullable targetPos = null; - if (to.nozzlePoints != null && to.nozzlePoints.Count > 0 - && to.nozzlePoints[0].X > 0.001 && to.nozzlePoints[0].Y > 0.001) - targetPos = to.nozzlePoints[0]; - if (to.measurementPoints != null && to.measurementPoints.Count > 0 - && to.measurementPoints[0].X > 0.001 && to.measurementPoints[0].Y > 0.001) - targetPos = to.measurementPoints[0]; - if (targetPos == null) - targetPos = new Point(to.x.Value, to.y.Value); - - // draw nozzle based - if (to.visObj.Placement == MtpSymbol.SymbolPlaceType.FitNozzles - && to.visObj.Symbol?.NozzlePos != null && to.visObj.Symbol?.NozzlePos.Length > 0) - { - // draw centered to nozzle pos in fixed size - var vb = ConstructViewboxVO(contentObject, rotation: 0.0); - vb.Height = 40; - vb.Width = 40; - vb.Stretch = Stretch.UniformToFill; - vb.Tag = to; - UIElementHelper.DrawToCanvasAtPositionAligned(canvas, - targetPos.Value.X, targetPos.Value.Y, - UIElementHelper.DrawToCanvasAlignment.Centered, vb); - - // make bounding box Rect - if (drawBoundingBoxes) - DrawToCanvasAtPositionSize(canvas, - targetPos.Value.X - vb.Width / 2, targetPos.Value.Y - vb.Height / 2, - vb.Width, vb.Height, ConstructRect(Brushes.Blue, 1.0)); - - // draw a nice label - var labelPos = UIElementHelper.RescalePointsByRatioOfFEs(contentObject, - vb, to.visObj.Symbol?.LabelPos); - - // draw the label - var pos = new Point(targetPos.Value.X, targetPos.Value.Y); - var li = (int)to.visObj.LabelAlignment; - if (li >= 0 && labelPos != null && li < labelPos.Length) - pos = pos + (Vector)labelPos[li]; - var labeltb = UIElementHelper.CreateStickyLabel(this.LabelFontSettings, "" + to.Name); - labeltb.Tag = to; - UIElementHelper.DrawToCanvasAtPositionAligned(canvas, - pos.X, pos.Y, - to.visObj.LabelAlignment, labeltb); - } - else - { - // draw square-sized symbol in fixed size over (x/y) - var size = 50; - - // make bounding box Rect - if (drawBoundingBoxes) - DrawToCanvasAtPositionSize(canvas, - // ReSharper disable PossibleLossOfFraction - to.x.Value - size / 2, to.y.Value - size / 2, - size, size, ConstructRect(Brushes.DarkOrange, 1.0)); - - // all helpers are NULL-invariant - var vb = ConstructViewboxVO(contentObject, rotation: 0.0); - vb.Tag = to; - DrawToCanvasAtPositionSize(canvas, - to.x.Value - size / 2, to.y.Value - size / 2, - size, size, vb); - } - - // handle - DrawHandlePoint(canvas, targetPos.Value.X, targetPos.Value.Y, drawHandlePoints); - } - } - } - } - } - - private MtpData.MtpPicture activePicture = null; - - public void SetPicture(MtpData.MtpPicture picture) - { - this.activePicture = picture; - } - - public void RedrawMtp() - { - // check - if (this.activePicture == null) - return; - - // draw & collect click objects - this.DrawMtpPictureIntoCanvas(canvasVisu, this.activePicture, - drawHandlePoints: checkboxDrawHP.IsChecked == true, - drawBoundingBoxes: checkboxDrawBB.IsChecked == true); - } - - // - // Callback handling - // - - private double zoomFactor = 1.0; - - public void ApplyCanvasZoom(double newZoom) - { - if (canvasVisu == null) - return; - this.zoomFactor = newZoom; - ScaleTransform scale = new ScaleTransform(this.zoomFactor, this.zoomFactor); - canvasVisu.LayoutTransform = scale; - } - - public void ZoomToFitCanvas() - { - if (canvasVisu == null || gridOuter == null) - return; - try - { - var ratioX = canvasVisu.Width / (gridOuter.ActualWidth - 15); - var ratioY = canvasVisu.Height / (gridOuter.ActualHeight - 2 * 15); - var ratio = Math.Max(ratioX, ratioY); - if (ratio > 0.05) - ApplyCanvasZoom(1.0f / ratio); - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); - ApplyCanvasZoom(1.0f); - } - } - - private void Button_Click(object sender, RoutedEventArgs e) - { - if (sender == buttonZoomIn) - { - ApplyCanvasZoom(this.zoomFactor * 1.15f); - } - if (sender == buttonZoomOut) - { - ApplyCanvasZoom(this.zoomFactor * 0.9f); - } - if (sender == buttonZoomFit) - { - ZoomToFitCanvas(); - } - if (sender == checkboxDrawBB || sender == checkboxDrawHP) - { - RedrawMtp(); - } - } - - // doubts? see: https://stackoverflow.com/questions/5000228/how-can-you-get-the-parent-of-a-uielement - - private object FindTagOfFrameworkElementParents(FrameworkElement fe) - { - if (fe.Tag != null) - return fe.Tag; - if (fe.Parent is FrameworkElement fep) - return FindTagOfFrameworkElementParents(fep); - return null; - } - - private void CanvasVisu_MouseDown(object sender, MouseButtonEventArgs e) - { - if (e.ChangedButton == MouseButton.Left && e.ClickCount == 2 && e.Source is FrameworkElement fe) - { - ; - - // fe could be a fine-detail FrameworkElement; check if some father hat a Tag - var tag = FindTagOfFrameworkElementParents(fe); - if (tag is MtpData.MtpBaseObject mbo) - { - MtpObjectDoubleClick?.Invoke(mbo); - } - } - } - - // - // Timer - // - - private void DispatcherTimer_Tick(object sender, EventArgs e) - { - if (this.activePicture?.Objects != null) - foreach (var mo in this.activePicture.Objects) - if (mo is MtpVisualObject vo && vo.dynInstance != null) - vo.dynInstance.Tick(this.VisuOptions); - } - } -} diff --git a/src/WpfMtpControl/MtpVisualObjectLib.cs b/src/WpfMtpControl/MtpVisualObjectLib.cs deleted file mode 100644 index ea3bb54ea..000000000 --- a/src/WpfMtpControl/MtpVisualObjectLib.cs +++ /dev/null @@ -1,383 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Markup; -using System.Windows.Shapes; -using System.Xml; - -namespace WpfMtpControl -{ - public class MtpSymbolMapRecord - { - /// - /// Applicable eClass Versions, delimited by ";". If empty, then any! - /// - public string EClassVersions = ""; - - /// - /// Applicable eClass Classes, delimited by ";". Only digits allow ("01024455"), - /// If empty, then eClassIRDI shall be set. - /// - public string EClassClasses = null; - - /// - /// Applicable eClass IRIDs, delimited by ";". If empty, then eClassClass shall be set. - /// - public string EClassIRDIs = null; - - /// - /// For the default (off) state. Full name of the symbol, that is "LibName"."SymbolName", - /// - public string SymbolDefault = null; - - /// - /// For the active (on) state. Full name of the symbol, that is "LibName"."SymbolName", - /// - public string SymbolActive = null; - - /// - /// For the intermediate (transitioning) state. Full name of the symbol, that is "LibName"."SymbolName", - /// - public string SymbolIntermediate = null; - - /// - /// Free use. - /// - public string Comment = null; - - /// - /// Priority for finding best match. Increasing is higher prio. - /// - public int Priority = 1; - - // - // Constructors - // - - public MtpSymbolMapRecord() { } - - public MtpSymbolMapRecord(string EClassVersions, string EClassClasses, string EClassIRDIs, - string SymbolDefault, string SymbolActive = null, string SymbolIntermediate = null, - string Comment = null, int Priority = 1) - { - this.EClassVersions = EClassVersions; - this.EClassClasses = EClassClasses; - this.EClassIRDIs = EClassIRDIs; - this.SymbolDefault = SymbolDefault; - this.SymbolActive = SymbolActive; - this.SymbolIntermediate = SymbolIntermediate; - this.Comment = Comment; - this.Priority = Priority; - } - } - - public class MtpSymbolMapRecordList : List - { - } - - public class MtpVisualObjectRecord - { - /// - /// Helpful name - /// - public string Name = ""; - - /// - /// Applicable eClass Versions. If empty, then any! - /// - public Dictionary eClassVersions = null; - - /// - /// Applicable eClass Classes. Only digits allow ("01024455"), If empty, then eClassIRDI shall be set. - /// - public Dictionary eClassClasses = null; - - /// - /// Applicable eClass IRIDs. If empty, then eClassClass shall be set. - /// - public Dictionary eClassIRDIs = null; - - /// - /// Reference to symbol, which is used - /// - public MtpSymbol Symbol = null; - - /// - /// Preffered placement type - /// - public MtpSymbol.SymbolPlaceType Placement = MtpSymbol.SymbolPlaceType.StretchToBoundingBox; - - /// - /// Preferred label alignment - /// - public UIElementHelper.DrawToCanvasAlignment LabelAlignment = UIElementHelper.DrawToCanvasAlignment.Centered; - - /// - /// Priority for finding best match. Increasing is higher prio. - /// - public int Priority = 1; - - public MtpVisualObjectRecord() { } - - /// - /// Initialize a record. - /// - /// Name. Not used for matching. - /// - /// Applicable eClass Versions, delimited by ";". If empty, then any! - /// Applicable eClass Classes, delimited by ";". Only digits allow ("01024455"), - /// If empty, then eClassIRDI shall be set. - /// Applicable eClass IRIDs, delimited by ";". If empty, then eClassClass shall - /// be set. - /// - /// - /// - public MtpVisualObjectRecord( - string Name, - MtpSymbol Symbol, - string eClassVersions = null, - string eClassClasses = null, - string eClassIRDIs = null, - Nullable placement = null, - UIElementHelper.DrawToCanvasAlignment labelAlignment = UIElementHelper.DrawToCanvasAlignment.Centered, - int prio = 1) - { - this.Name = Name; - this.Symbol = Symbol; - this.eClassVersions = PrepDict(eClassVersions); - this.eClassClasses = PrepDict(eClassClasses); - this.eClassIRDIs = PrepDict(eClassIRDIs); - if (placement != null) - this.Placement = placement.Value; - this.LabelAlignment = labelAlignment; - this.Priority = prio; - } - - public MtpVisualObjectRecord(MtpSymbolLib symbolLib, MtpSymbolMapRecord config) - { - if (config != null) - { - this.Name = config.SymbolDefault; - this.eClassVersions = PrepDict(config.EClassVersions); - this.eClassClasses = PrepDict(config.EClassClasses); - this.eClassIRDIs = PrepDict(config.EClassIRDIs); - - if (symbolLib != null && symbolLib.ContainsKey(config.SymbolDefault)) - { - var symbol = symbolLib[config.SymbolDefault]; - this.Symbol = symbol; - this.Placement = symbol.PreferredPlacement; - this.LabelAlignment = symbol.PreferredLabelAlignment; - } - - this.Priority = config.Priority; - } - - } - - public static Dictionary PrepDict(string str) - { - if (str == null) - return null; - var arr = str.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); - // ReSharper disable once ConditionIsAlwaysTrueOrFalse - if (arr == null || arr.Length < 1) - return null; - var res = new Dictionary(StringComparer.InvariantCultureIgnoreCase); - foreach (var a in arr) - res.Add(a, a); - return res; - } - - public static string FilterEclassClass(string input) - { - if (input == null) - return null; - var justNumbers = new String(input.Where(Char.IsDigit).ToArray()); - return justNumbers; - } - - } - - public class MtpVisualObjectLib - { - private List records = new List(); - - /// - /// Call once to load the static definitions, which are contained in the resources. - /// - public void LoadStatic(MtpSymbolLib syms) - { - - // add elements - records.Add(new MtpVisualObjectRecord("Pressurized_vessel_horizontal", - syms["PNID_ISO10628.Pressurized_vessel_horizontal"], - eClassVersions: "10.1", eClassClasses: "99999999", prio: 0)); - - records.Add(new MtpVisualObjectRecord("Pressurized_vessel_vertical", - syms["PNID_ISO10628.Pressurized_vessel_vertical"], - eClassClasses: "36020190;36030101", prio: 0)); - - records.Add(new MtpVisualObjectRecord("Shutoff_Valve", - syms["PNID_ISO10628.Shutoff_Valve_nozzled"], - eClassVersions: "10.1", eClassClasses: "37010201", - placement: MtpSymbol.SymbolPlaceType.FitNozzles, prio: 0)); - - //// records.Add(new MtpVisualObjectRecord("Pump_general", - //// syms["PNID_ISO10628.Pump_general_nozzled"], - //// eClassClasses: "36419090;3641", placement: MtpSymbol.SymbolPlaceType.FitNozzles, prio: 0)); - - records.Add(new MtpVisualObjectRecord("Sensor_general", - syms["PNID_ISO10628.Sensor_general"], - eClassClasses: "27209090;27143121;27200492;27200600;27200200;27200589", prio: 0)); - - records.Add(new MtpVisualObjectRecord("Controller_general", - syms["PNID_ISO10628.Sensor_general"], - eClassClasses: "27210790;27210101", prio: 0)); - - records.Add(new MtpVisualObjectRecord("Source_general", - syms["PNID_ISO10628.Source_tagged"], - placement: MtpSymbol.SymbolPlaceType.FitNozzles, - labelAlignment: UIElementHelper.DrawToCanvasAlignment.North, prio: 0)); - - records.Add(new MtpVisualObjectRecord("Sink_general", - syms["PNID_ISO10628.Sink_tagged"], - placement: MtpSymbol.SymbolPlaceType.FitNozzles, - labelAlignment: UIElementHelper.DrawToCanvasAlignment.South, prio: 0)); - - // access resource dictionaries FESTO - - records.Add(new MtpVisualObjectRecord("Control_Valve", - syms["PNID_Festo.control_valve_tagged-u-nozzled"], - eClassClasses: "37010203", placement: MtpSymbol.SymbolPlaceType.FitNozzles, prio: 0)); - - records.Add(new MtpVisualObjectRecord("Manual_Valve", - syms["PNID_Festo.manual_valve_default-u-nozzled"], - eClassClasses: "37010201", placement: MtpSymbol.SymbolPlaceType.FitNozzles, prio: 0)); - - records.Add(new MtpVisualObjectRecord("Stirrer", - syms["PNID_Festo.stirrer_active-u"], - eClassClasses: "36090590", placement: MtpSymbol.SymbolPlaceType.StretchToBoundingBox, prio: 0)); - - records.Add(new MtpVisualObjectRecord("Pump_general", - syms["PNID_Festo.pump_active-r-nozzled"], - eClassClasses: "36419090;3641", placement: MtpSymbol.SymbolPlaceType.FitNozzles, prio: 0)); - } - - public void LoadFromSymbolMappings(MtpSymbolLib symbolLib, IEnumerable mappings) - { - // access - if (symbolLib == null | mappings == null) - return; - - // each .. - foreach (var map in mappings) - records.Add(new MtpVisualObjectRecord(symbolLib, map)); - } - - public MtpVisualObjectRecord FindVisualObjectByName(string name) - { - // try find - foreach (var rec in records) - { - // try to find negative events! - if (name != null && name.Length > 0 && rec.Name.ToLower() != name.Trim().ToLower()) - continue; - // ok - return rec; - } - - // end of search - return null; - } - - public static bool MatchEclassClass(Dictionary recClasses, string thisClass) - { - // specified in record? .. if not, default: True - if (recClasses == null || recClasses.Count < 1) - return true; - if (thisClass == null || thisClass.Length < 1) - return false; - - // split rec classes - foreach (var rc in recClasses.Values) - { - // require to be formally valid - var rcc = rc.Trim(); - - // ok, if partially match - if (thisClass.StartsWith(rcc)) - return true; - } - - // ok, not - return false; - } - - public MtpVisualObjectRecord FindVisualObjectByClass( - string eClassVersion = null, string eClassClass = null, string eClassIRDI = null) - { - // prepare input - eClassClass = MtpVisualObjectRecord.FilterEclassClass(eClassClass); - - // minimal match - if (eClassClass != null) - eClassClass = eClassClass.Trim(); - if (eClassIRDI != null) - eClassIRDI = eClassIRDI.Trim(); - if ((eClassClass == null || eClassClass.Length < 1) - && (eClassIRDI == null || eClassIRDI.Length < 1)) - return null; - - // try find - MtpVisualObjectRecord foundRec = null; - int foundPrio = -1; - - foreach (var rec in records) - { - // record either needs to have class or irdi - if ((rec.eClassClasses == null || rec.eClassClasses.Count < 1) - && (rec.eClassIRDIs == null || rec.eClassIRDIs.Count < 1)) - continue; - - // try to find negative events! - if (eClassVersion != null && eClassVersion.Length > 0 && rec.eClassVersions != null - && !rec.eClassVersions.ContainsKey(eClassVersion)) - continue; - //// if (eClassClass != null && eClassClass.Length > 0 && rec.eClassClasses != null - //// && !rec.eClassClasses.ContainsKey(eClassClass)) - //// continue; - if (!MatchEclassClass(rec.eClassClasses, eClassClass)) - continue; - if (eClassIRDI != null && eClassIRDI.Length > 0 && rec.eClassIRDIs != null - && !rec.eClassIRDIs.ContainsKey(eClassIRDI)) - continue; - - // check if better? - if (rec.Priority >= foundPrio) - { - foundRec = rec; - foundPrio = rec.Priority; - } - } - - // end of search - return foundRec; - } - } -} diff --git a/src/WpfMtpControl/Properties/AssemblyInfo.cs b/src/WpfMtpControl/Properties/AssemblyInfo.cs deleted file mode 100644 index 05f930c80..000000000 --- a/src/WpfMtpControl/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System.Reflection; -using System.Resources; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Windows; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die einer Assembly zugeordnet sind. -[assembly: AssemblyTitle("WpfMtpControl")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("WpfMtpControl")] -[assembly: AssemblyCopyright("Copyright © 2020")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly -// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von -// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. -[assembly: ComVisible(false)] - -//Um mit dem Erstellen lokalisierbarer Anwendungen zu beginnen, legen Sie -//ImCodeVerwendeteKultur in der .csproj-Datei -//in einer fest. Wenn Sie in den Quelldateien beispielsweise Deutsch -//(Deutschland) verwenden, legen Sie auf \"de-DE\" fest. Heben Sie dann die Auskommentierung -//des nachstehenden NeutralResourceLanguage-Attributs auf. Aktualisieren Sie "en-US" in der nachstehenden Zeile, -//sodass es mit der UICulture-Einstellung in der Projektdatei übereinstimmt. - -//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] - - -[assembly: ThemeInfo( - ResourceDictionaryLocation.None, //Speicherort der designspezifischen Ressourcenwörterbücher - //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, - // oder in den Anwendungsressourcen-Wörterbüchern nicht gefunden werden kann.) - ResourceDictionaryLocation.SourceAssembly //Speicherort des generischen Ressourcenwörterbuchs - //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, - // designspezifischen Ressourcenwörterbuch nicht gefunden werden kann.) -)] - - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, -// übernehmen, indem Sie "*" eingeben: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/WpfMtpControl/Properties/Resources.Designer.cs b/src/WpfMtpControl/Properties/Resources.Designer.cs deleted file mode 100644 index a78a97c8e..000000000 --- a/src/WpfMtpControl/Properties/Resources.Designer.cs +++ /dev/null @@ -1,62 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Dieser Code wurde von einem Tool generiert. -// Laufzeitversion: 4.0.30319.42000 -// -// Änderungen an dieser Datei können fehlerhaftes Verhalten verursachen und gehen verloren, wenn -// der Code neu generiert wird. -// -//------------------------------------------------------------------------------ - -namespace WpfMtpControl.Properties { - - - /// - /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. - /// - // Diese Klasse wurde von der StronglyTypedResourceBuilder-Klasse - // über ein Tool wie ResGen oder Visual Studio automatisch generiert. - // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen - // mit der Option /str erneut aus, oder erstellen Sie Ihr VS-Projekt neu. - [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() { - } - - /// - /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. - /// - [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("WpfMtpControl.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle - /// Ressourcenlookups, die diese stark typisierte Ressourcenklasse verwenden. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - } -} diff --git a/src/WpfMtpControl/Properties/Resources.resx b/src/WpfMtpControl/Properties/Resources.resx deleted file mode 100644 index af7dbebba..000000000 --- a/src/WpfMtpControl/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/src/WpfMtpControl/Properties/Settings.Designer.cs b/src/WpfMtpControl/Properties/Settings.Designer.cs deleted file mode 100644 index 368052671..000000000 --- a/src/WpfMtpControl/Properties/Settings.Designer.cs +++ /dev/null @@ -1,30 +0,0 @@ -//------------------------------------------------------------------------------ -// -// 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. -// -//------------------------------------------------------------------------------ - -namespace WpfMtpControl.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; - } - } - } -} diff --git a/src/WpfMtpControl/Properties/Settings.settings b/src/WpfMtpControl/Properties/Settings.settings deleted file mode 100644 index 033d7a5e9..000000000 --- a/src/WpfMtpControl/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/WpfMtpControl/Resources/PNID_DIN_EN_ISO_10628.xaml b/src/WpfMtpControl/Resources/PNID_DIN_EN_ISO_10628.xaml deleted file mode 100644 index c58ba25f2..000000000 --- a/src/WpfMtpControl/Resources/PNID_DIN_EN_ISO_10628.xaml +++ /dev/null @@ -1,268 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/WpfMtpControl/Resources/PNID_Festo.xaml b/src/WpfMtpControl/Resources/PNID_Festo.xaml deleted file mode 100644 index 54a1fa9ef..000000000 --- a/src/WpfMtpControl/Resources/PNID_Festo.xaml +++ /dev/null @@ -1,533 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/WpfMtpControl/UiElementHelper.cs b/src/WpfMtpControl/UiElementHelper.cs deleted file mode 100644 index 05179e94c..000000000 --- a/src/WpfMtpControl/UiElementHelper.cs +++ /dev/null @@ -1,497 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Markup; -using System.Windows.Media; -using System.Windows.Shapes; -using System.Xml; - -namespace WpfMtpControl -{ - // ReSharper disable once ClassNeverInstantiated.Global - public class UIElementHelper - { - public static UIElement cloneElement(UIElement orig) - { - if (orig == null) - return (null); - - string s = XamlWriter.Save(orig); - StringReader stringReader = new StringReader(s); - XmlReader xmlReader = XmlTextReader.Create(stringReader, new XmlReaderSettings()); - return (UIElement)XamlReader.Load(xmlReader); - - } - - public static Label FindLabelWithText(System.Windows.DependencyObject parent, string textToFind) - { - // trivial - if (parent == null) - return null; - - // recurse visual tree - int childrenCount = System.Windows.Media.VisualTreeHelper.GetChildrenCount(parent); - for (int i = 0; i < childrenCount; i++) - { - var child = System.Windows.Media.VisualTreeHelper.GetChild(parent, i); - - // deep inspect? - var childLabel = child as Label; - if (childLabel != null && childLabel.Content != null) - { - var childLabelText = childLabel.Content as string; - if (childLabelText != null && childLabelText.Trim() == textToFind.Trim()) - return childLabel; - } - - // recurse? - var childFound = FindLabelWithText(child, textToFind); - if (childFound != null) - return childFound; - } - - // no - return null; - } - - public static void ApplyMultiLabel(FrameworkElement contentObject, Tuple[] labelTexts = null) - { - // trivial - if (contentObject == null) - return; - - // can name labels? - if (labelTexts != null) - foreach (var lt in labelTexts) - { - var tagLebel = UIElementHelper.FindLabelWithText(contentObject, lt.Item1); - if (tagLebel != null) - tagLebel.Content = "" + lt.Item2; - } - } - - private static void FindNozzlesViaTagsIntern( - System.Windows.DependencyObject parent, Dictionary namedNozzles, - string matchHead, bool extractShapes = false) - { - // trivial - if (parent == null || namedNozzles == null) - return; - - var toExtract = new List(); - - // recurse visual tree - int childrenCount = System.Windows.Media.VisualTreeHelper.GetChildrenCount(parent); - for (int i = 0; i < childrenCount; i++) - { - var child = System.Windows.Media.VisualTreeHelper.GetChild(parent, i); - - // deep inspect? - var childEllipse = child as Ellipse; - if (childEllipse != null) - { - var childEllipseTagText = childEllipse.Tag as string; - if (childEllipseTagText != null && childEllipseTagText.Trim() != "") - { - var m = Regex.Match(childEllipseTagText, matchHead + @"#(\d+)"); - if (m.Success) - { - var nid = Convert.ToInt32(m.Groups[1].ToString()); - - var x = Canvas.GetLeft(childEllipse) + childEllipse.Width / 2; - var y = Canvas.GetTop(childEllipse) + childEllipse.Height / 2; - if (nid > 0 && nid < 99) - namedNozzles[nid] = new Point(x, y); - - // extract? - // ReSharper disable once ConditionIsAlwaysTrueOrFalse - if (extractShapes && child is UIElement) - toExtract.Add(child as UIElement); - } - } - } - - // recurse? - FindNozzlesViaTagsIntern(child, namedNozzles, matchHead, extractShapes); - } - - if (extractShapes && parent is Canvas) - foreach (var te in toExtract) - (parent as Canvas).Children.Remove(te); - - } - - public static Point[] FindNozzlesViaTags( - System.Windows.DependencyObject parent, string matchHead, bool extractShapes = false) - { - // find named nozzles - var namedNozzles = new Dictionary(); - UIElementHelper.FindNozzlesViaTagsIntern(parent, namedNozzles, matchHead, extractShapes: extractShapes); - - // integrity check - for (int i = 0; i < namedNozzles.Count; i++) - if (!namedNozzles.ContainsKey(1 + i)) - { - namedNozzles = null; - break; - } - - // still there - Point[] res = null; - if (namedNozzles != null) - { - res = new Point[namedNozzles.Count]; - for (int i = 0; i < namedNozzles.Count; i++) - res[i] = namedNozzles[1 + i]; - } - - return res; - } - - /// - /// Computes center of gravity, returns null in case of any error. - /// - public static Nullable ComputeCOG(Point[] pts) - { - if (pts == null || pts.Length < 1) - return null; - - var sum = pts[0]; - for (int i = 1; i < pts.Length; i++) - sum.Offset(pts[i].X, pts[i].Y); - sum.X /= 1.0 * pts.Length; - sum.Y /= 1.0 * pts.Length; - - return sum; - } - - /// - /// Computes the maximum distance of each point to a given center point. Returns null in case of any error. - /// - public static Nullable ComputeRadiusForCenterPointer(Point[] pts, Point cog) - { - // ReSharper disable once ConditionIsAlwaysTrueOrFalse - if (pts == null || pts.Length < 1 || cog == null) - return null; - - var r = 0.0; - for (int i = pts.Length - 1; i >= 0; i--) - { - var xd = pts[i].X - cog.X; - var yd = pts[i].Y - cog.Y; - var d = Math.Sqrt(xd * xd + yd * yd); - if (d > r) - r = d; - } - - return r; - } - - public static Point[] RescalePointsByRatioOfFEs( - FrameworkElement original, FrameworkElement scaled, Point[] ptsOriginal) - { - if (original == null || scaled == null || ptsOriginal == null || ptsOriginal.Length < 1) - return null; - var scaleFac = Math.Min(scaled.Width / original.Width, scaled.Height / original.Height); - var ptsScaled = new Point[ptsOriginal.Length]; - for (int i = 0; i < ptsOriginal.Length; i++) - { - var x = (ptsOriginal[i].X - original.Width / 2) * scaleFac; - var y = (ptsOriginal[i].Y - original.Height / 2) * scaleFac; - ptsScaled[i] = new Point(x, y); - } - return ptsScaled; - } - - public class Transformation2D - { - public double Scale, Rot, OfsX, OfsY; - public Transformation2D() { } - public Transformation2D(double Scale, double Rot, double OfsX, double OfsY) - { - this.Scale = Scale; - this.Rot = Rot; - this.OfsX = OfsX; - this.OfsY = OfsY; - } - } - - public static Point[] ApplyTransformation(Transformation2D trans, Point center, Point[] pts) - { - // setup - if (pts == null || pts.Length < 1) - return null; - var res = new Point[pts.Length]; - - // 1 for 1 - for (int i = 0; i < pts.Length; i++) - { - // around center .. - var x = pts[i].X - center.X; - var y = pts[i].Y - center.Y; - - // scale - x = x * trans.Scale; - y = y * trans.Scale; - - // rotate (mathematically positive!) - var radian = -trans.Rot * (Math.PI / 180); - double cosTheta = Math.Cos(radian); - double sinTheta = Math.Sin(radian); - var nx = cosTheta * x - sinTheta * y; - var ny = sinTheta * x + cosTheta * y; - - // move - nx += trans.OfsX; - ny += trans.OfsY; - - // store - res[i] = new Point(nx, ny); - } - - // ok - return res; - } - - public static Nullable CumulatedErrorToFieldOfPoints(Point[] pts, Point[] field) - { - // setup - if (pts == null || field == null || pts.Length < 1 || field.Length < 1) - return null; - double res = 0; - - // we're striking through the field of points - var strike = new bool[field.Length]; - - // pts are leading - // ReSharper disable once ForCanBeConvertedToForeach - for (int pi = 0; pi < pts.Length; pi++) - { - // find neareast neighbour - var nd = Double.MaxValue; - var nfi = -1; - for (int fi = 0; fi < field.Length; fi++) - if (!strike[fi]) - { - var dx = field[fi].X - pts[pi].X; - var dy = field[fi].Y - pts[pi].Y; - var d = Math.Sqrt(dx * dx + dy * dy); - if (d < nd) - { - nd = d; - nfi = fi; - } - } - - // there is no room for uups! - if (nfi < 0) - return null; - - // compute - res += nd; - strike[nfi] = true; - } - - // ok - return res; - } - - public static Transformation2D FindBestFitForFieldOfPoints( - Point[] pts, Point[] field, - Transformation2D start, - double rangeScale, double rangeRot, double rangeXY, - int steps, int iterations) - { - // setup - if (pts == null || field == null || pts.Length < 1 || field.Length < 1 || start == null || iterations < 0) - return null; - - // systematicall apply disturbances - // on the hierarchy: scale, rot (in degrees), ofsX, ofsY - - var bestTrans = start; - double bestError = Double.MaxValue; - var be = CumulatedErrorToFieldOfPoints(pts, field); - if (be != null) - bestError = be.Value; - - var center = ComputeCOG(pts); - if (center == null) - return null; - - for (int iScale = 0; iScale <= steps; iScale++) - for (int iRot = 0; iRot <= steps; iRot++) - for (int iY = 0; iY <= steps; iY++) - for (int iX = 0; iX <= steps; iX++) - { - // current point - var currTrans = new Transformation2D( - start.Scale - rangeScale + (2 * rangeScale * iScale / steps), - start.Rot - rangeRot + (2 * rangeRot * iRot / steps), - start.OfsX - rangeXY + (2 * rangeXY * iX / steps), - start.OfsY - rangeXY + (2 * rangeXY * iY / steps)); - - // some parts of the vectorroom are "taboo" - if (currTrans.Scale <= 0.000) - continue; - - // transform - var currPts = ApplyTransformation(currTrans, center.Value, pts); - - // evaluate - var error = CumulatedErrorToFieldOfPoints(currPts, field); - if (error != null && error.Value < bestError) - { - bestError = error.Value; - bestTrans = currTrans; - } - } - - // go into "recursion" - var rm = 1.0 / steps; - // ReSharper disable once UnusedVariable - var betterTrans = FindBestFitForFieldOfPoints(pts, field, bestTrans, - rm * rangeScale, rm * rangeRot, rm * rangeXY, steps, iterations - 1); - - // result - return bestTrans; - } - - public class FontSettings - { - public FontFamily FontFamily; - public FontStyle Style; - public FontWeight Weight; - public FontStretch Stretch; - public double EmSize; - - public FontSettings() { } - - public FontSettings( - FontFamily fontFamily, FontStyle style, FontWeight weight, FontStretch stretch, double EmSize) - { - this.FontFamily = fontFamily; - this.Style = style; - this.Weight = weight; - this.Stretch = stretch; - this.EmSize = EmSize; - } - - public Size MeasureString(string candidate) - { - var formattedText = new FormattedText( - candidate, - CultureInfo.CurrentCulture, - FlowDirection.LeftToRight, - new Typeface(this.FontFamily, this.Style, this.Weight, this.Stretch), - this.EmSize, - Brushes.Black, - new NumberSubstitution(), - TextFormattingMode.Display, - /* - * (mristin, 2020-12-04) - * The following argument, pixelsPerDip, is a complicated one. We set it here to value 1.0 - * since we are simply upgrading NET Framework from 4.6.1 to 4.7.2. - * - * See https://github.com/Microsoft/WPF-Samples/tree/master/PerMonitorDPI, - * https://stackoverflow.com/questions/40277388 and - * https://social.msdn.microsoft.com/Forums/vstudio/en-US/ef99bb56-df57-411a-a158-cad1eaa63850 - */ - 1.0 - ); - - return new Size(formattedText.Width, formattedText.Height); - } - } - - public static TextBlock CreateStickyLabel(FontSettings fontSettings, string text, double padding = 2.0) - { - var size = fontSettings.MeasureString(text); - // TODO (MICHA, 2020-10-04): check if font is set correctly .. - // TODO (MICHA, 2020-10-04): seems, that for Textblock the alignement DOES NOT WORK! - var tb = new TextBlock(); - tb.Height = size.Height + 2 * padding; - tb.Width = size.Width + 2 * padding; - tb.HorizontalAlignment = HorizontalAlignment.Center; - tb.VerticalAlignment = VerticalAlignment.Center; - tb.Text = text; - return tb; - } - - public enum DrawToCanvasAlignment { North = 0, East = 1, South = 2, West = 3, Centered = 4 }; - - public static DrawToCanvasAlignment TranslateRotToAlignemnt(double rot) - { - // modulo - var pi = Math.PI; - rot = rot % (2 * pi); - - // 4 segments for now - if (rot > -0.25 * pi && rot <= 0.25 * pi) - return DrawToCanvasAlignment.North; - if (rot > 0.25 * pi && rot <= 0.75 * pi) - return DrawToCanvasAlignment.East; - if (rot > 0.75 * pi && rot <= 1.25 * pi) - return DrawToCanvasAlignment.South; - if (rot > 1.25 * pi && rot <= 1.75 * pi) - return DrawToCanvasAlignment.North; - // ups - return DrawToCanvasAlignment.Centered; - } - - public static void DrawToCanvasAtPositionAligned( - Canvas canvas, double x, double y, DrawToCanvasAlignment alignment, FrameworkElement fe) - { - if (canvas == null || fe == null) - return; - canvas.Children.Add(fe); - - if (alignment == DrawToCanvasAlignment.North) - { - Canvas.SetLeft(fe, x - fe.Width / 2); - Canvas.SetTop(fe, y - fe.Height); - } - - if (alignment == DrawToCanvasAlignment.South) - { - Canvas.SetLeft(fe, x - fe.Width / 2); - Canvas.SetTop(fe, y); - } - - if (alignment == DrawToCanvasAlignment.West) - { - Canvas.SetLeft(fe, x - fe.Width); - Canvas.SetTop(fe, y - fe.Height / 2); - } - - if (alignment == DrawToCanvasAlignment.East) - { - Canvas.SetLeft(fe, x); - Canvas.SetTop(fe, y - fe.Height / 2); - } - - if (alignment == DrawToCanvasAlignment.Centered) - { - Canvas.SetLeft(fe, x - fe.Width / 2); - Canvas.SetTop(fe, y - fe.Height / 2); - } - } - - } -} diff --git a/src/WpfMtpControl/WpfMtpControl.csproj b/src/WpfMtpControl/WpfMtpControl.csproj deleted file mode 100644 index a146b0e3a..000000000 --- a/src/WpfMtpControl/WpfMtpControl.csproj +++ /dev/null @@ -1,22 +0,0 @@ - - - net6.0-windows - library - false - true - false - - - - - - - - PreserveNewest - - - - - - - From 084ecb6e40dc40214b5246a618a78a8b7183cea3 Mon Sep 17 00:00:00 2001 From: Alexander Wollbrink Date: Fri, 12 Jul 2024 11:50:46 +0200 Subject: [PATCH 10/13] WpfMtpVisuViewer.csproj --- src/WpfMtpVisuViewer/App.xaml | 18 - src/WpfMtpVisuViewer/App.xaml.cs | 23 - src/WpfMtpVisuViewer/LICENSE.txt | 1475 ----------------- src/WpfMtpVisuViewer/MainWindow.xaml | 66 - src/WpfMtpVisuViewer/MainWindow.xaml.cs | 365 ---- .../Opc.Ua.SampleClient.Config.xml | 99 -- .../Properties/AssemblyInfo.cs | 55 - .../Properties/Resources.Designer.cs | 71 - .../Properties/Resources.resx | 117 -- .../Properties/Settings.Designer.cs | 30 - .../Properties/Settings.settings | 7 - src/WpfMtpVisuViewer/WpfMtpVisuViewer.csproj | 31 - .../WpfMtpVisuViewer.options.json | 32 - 13 files changed, 2389 deletions(-) delete mode 100644 src/WpfMtpVisuViewer/App.xaml delete mode 100644 src/WpfMtpVisuViewer/App.xaml.cs delete mode 100644 src/WpfMtpVisuViewer/LICENSE.txt delete mode 100644 src/WpfMtpVisuViewer/MainWindow.xaml delete mode 100644 src/WpfMtpVisuViewer/MainWindow.xaml.cs delete mode 100644 src/WpfMtpVisuViewer/Opc.Ua.SampleClient.Config.xml delete mode 100644 src/WpfMtpVisuViewer/Properties/AssemblyInfo.cs delete mode 100644 src/WpfMtpVisuViewer/Properties/Resources.Designer.cs delete mode 100644 src/WpfMtpVisuViewer/Properties/Resources.resx delete mode 100644 src/WpfMtpVisuViewer/Properties/Settings.Designer.cs delete mode 100644 src/WpfMtpVisuViewer/Properties/Settings.settings delete mode 100644 src/WpfMtpVisuViewer/WpfMtpVisuViewer.csproj delete mode 100644 src/WpfMtpVisuViewer/WpfMtpVisuViewer.options.json diff --git a/src/WpfMtpVisuViewer/App.xaml b/src/WpfMtpVisuViewer/App.xaml deleted file mode 100644 index 766a3efb2..000000000 --- a/src/WpfMtpVisuViewer/App.xaml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/src/WpfMtpVisuViewer/App.xaml.cs b/src/WpfMtpVisuViewer/App.xaml.cs deleted file mode 100644 index 56f34d750..000000000 --- a/src/WpfMtpVisuViewer/App.xaml.cs +++ /dev/null @@ -1,23 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Configuration; -using System.Data; -using System.Linq; -using System.Threading.Tasks; -using System.Windows; - -namespace WpfMtpVisuViewer -{ - public partial class App : Application - { - } -} diff --git a/src/WpfMtpVisuViewer/LICENSE.txt b/src/WpfMtpVisuViewer/LICENSE.txt deleted file mode 100644 index 01f9cb5eb..000000000 --- a/src/WpfMtpVisuViewer/LICENSE.txt +++ /dev/null @@ -1,1475 +0,0 @@ -Copyright (c) 2018-2023 Festo SE & Co. KG -, -author: Michael Hoffmeister - -Copyright (c) 2019-2021 PHOENIX CONTACT GmbH & Co. KG -, -author: Andreas Orzelski - -Copyright (c) 2019-2020 Fraunhofer IOSB-INA Lemgo, - eine rechtlich nicht selbstaendige Einrichtung der Fraunhofer-Gesellschaft - zur Foerderung der angewandten Forschung e.V. - -Copyright (c) 2020 Schneider Electric Automation GmbH -, -author: Marco Mendes - -Copyright (c) 2020 SICK AG - -Copyright (c) 2021 KEB Automation KG - -Copyright (c) 2021 Lenze SE -author: Jonas Grote, Denis Göllner, Sebastian Bischof - -The AASX Package Explorer is licensed under the Apache License 2.0 -(Apache-2.0, see below). - -The AASX Package Explorer is a sample application for demonstration of the -features of the Asset Administration Shell. -The implementation uses the concepts of the document "Details of the Asset -Administration Shell" published on www.plattform-i40.de which is licensed -under Creative Commons CC BY-ND 3.0 DE. - -When using eCl@ss or IEC CDD data, please check the corresponding license -conditions. - -------------------------------------------------------------------------------- - -The components below are used in AASX Package Explorer. -The related licenses are listed for information purposes only. -Some licenses may only apply to their related plugins. - -The browser functionality is licensed under the cefSharp license (see below). - -The Newtonsoft.JSON serialization is licensed under the MIT License -(MIT, see below). - -The QR code generation is licensed under the MIT license (MIT, see below). - -The Zxing.Net Dot Matrix Code (DMC) generation is licensed under -the Apache License 2.0 (Apache-2.0, see below). - -The Grapevine REST server framework is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The AutomationML.Engine is licensed under the MIT license (MIT, see below). - -The MQTT server and client is licensed under the MIT license (MIT, see below). - -The ClosedXML Excel reader/writer is licensed under the MIT license (MIT, -see below). - -The CountryFlag WPF control is licensed under the Code Project Open License -(CPOL, see below). - -The DocumentFormat.OpenXml SDK is licensed under the MIT license (MIT, -see below). - -The ExcelNumberFormat number parser is licensed under the MIT license (MIT, -see below). - -The FastMember reflection access is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The IdentityModel OpenID client is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The jose-jwt object signing and encryption is licensed under the -MIT license (MIT, see below). - -The ExcelDataReader is licensed under the MIT license (MIT, see below). - -Portions copyright (c) by OPC Foundation, Inc. and licensed under the -Reciprocal Community License (RCL, see below) - -The OPC UA Example Code of OPC UA Standard is licensed under the MIT license -(MIT, see below). - -The MSAGL (Microsoft Automatic Graph Layout) is licensed under the MIT license -(MIT, see below) - -Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license -(MIT, see below). - -The Magick.NET library is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed -under Apache License 2.0 (Apache-2.0, see below). - -------------------------------------------------------------------------------- - - -With respect to AASX Package Explorer -===================================== - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to cefSharp -======================== - -(https://raw.githubusercontent.com/cefsharp/CefSharp/master/LICENSE) - -Copyright © The CefSharp Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - * Neither the name of Google Inc. nor the name Chromium Embedded - Framework nor the name CefSharp nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -With respect to Newtonsoft.Json -=============================== - -(https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md) - -The MIT License (MIT) - -Copyright (c) 2007 James Newton-King - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to QRcoder -======================= - -(https://github.com/codebude/QRCoder/blob/master/LICENSE.txt) - -The MIT License (MIT) - -Copyright (c) 2013-2018 Raffael Herrmann - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to ZXing.Net -========================= -With respect to Grapevine -========================= -With respect to FastMember -========================== -With respect to IdentityModel -============================= - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to AutomationML.Engine -=================================== - -(https://raw.githubusercontent.com/AutomationML/AMLEngine2.1/master/license.txt) - -The MIT License (MIT) - -Copyright 2017 AutomationML e.V. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - -With respect to MQTTnet -======================= - -(https://github.com/chkr1011/MQTTnet/blob/master/LICENSE) - -MIT License - -MQTTnet Copyright (c) 2016-2019 Christian Kratky - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to ClosedXML -========================= - -(https://github.com/ClosedXML/ClosedXML/blob/develop/LICENSE) - -MIT License - -Copyright (c) 2016 ClosedXML - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to CountryFlag -=========================== - -(https://www.codeproject.com/Articles/190722/WPF-CountryFlag-Control) - -The Code Project Open License (CPOL) 1.02 - -Copyright © 2017 Meshack Musundi - -Preamble - -This License governs Your use of the Work. This License is intended to allow -developers to use the Source Code and Executable Files provided as part of -the Work in any application in any form. - -The main points subject to the terms of the License are: - - Source Code and Executable Files can be used in commercial applications; - Source Code and Executable Files can be redistributed; and - Source Code can be modified to create derivative works. - No claim of suitability, guarantee, or any warranty whatsoever is provided. - The software is provided "as-is". - The Article(s) accompanying the Work may not be distributed or republished - without the Author's consent - -This License is entered between You, the individual or other entity reading or -otherwise making use of the Work licensed pursuant to this License and the -individual or other entity which offers the Work under the terms of this -License ("Author"). - -License - -THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS -CODE PROJECT OPEN LICENSE ("LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT -AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED -UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. - -BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HEREIN, YOU ACCEPT AND AGREE -TO BE BOUND BY THE TERMS OF THIS LICENSE. THE AUTHOR GRANTS YOU THE RIGHTS -CONTAINED HEREIN IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND -CONDITIONS. IF YOU DO NOT AGREE TO ACCEPT AND BE BOUND BY THE TERMS OF THIS -LICENSE, YOU CANNOT MAKE ANY USE OF THE WORK. - -Definitions. - "Articles" means, collectively, all articles written by Author which -describes how the Source Code and Executable Files for the Work may -be used by a user. - "Author" means the individual or entity that offers the Work under -the terms of this License. - "Derivative Work" means a work based upon the Work or upon the Work -and other pre-existing works. - "Executable Files" refer to the executables, binary files, -configuration and any required data files included in the Work. - "Publisher" means the provider of the website, magazine, CD-ROM, -DVD or other medium from or by which the Work is obtained by You. - "Source Code" refers to the collection of source code and -configuration files used to create the Executable Files. - "Standard Version" refers to such a Work if it has not been modified, -or has been modified in accordance with the consent of the Author, -such consent being in the full discretion of the Author. - "Work" refers to the collection of files distributed by the Publisher, -including the Source Code, Executable Files, binaries, data files, -documentation, whitepapers and the Articles. - "You" is you, an individual or entity wishing to use the Work and -exercise your rights under this License. - -Fair Use/Fair Use Rights. Nothing in this License is intended to reduce, -limit, or restrict any rights arising from fair use, fair dealing, -first sale or other limitations on the exclusive rights of the -copyright owner under copyright law or other applicable laws. - -License Grant. Subject to the terms and conditions of this License, the -Author hereby grants You a worldwide, royalty-free, non-exclusive, -perpetual (for the duration of the applicable copyright) license -to exercise the rights in the Work as stated below: - You may use the standard version of the Source Code or Executable -Files in Your own applications. - You may apply bug fixes, portability fixes and other modifications -obtained from the Public Domain or from the Author. A Work modified -in such a way shall still be considered the standard version and will -be subject to this License. - You may otherwise modify Your copy of this Work (excluding the Articles) -in any way to create a Derivative Work, provided that You insert a prominent -notice in each changed file stating how, when and where You changed that file. - You may distribute the standard version of the Executable Files and Source -Code or Derivative Work in aggregate with other (possibly commercial) -programs as part of a larger (possibly commercial) software distribution. - The Articles discussing the Work published in any form by the author may -not be distributed or republished without the Author's consent. The author -retains copyright to any such Articles. You may use the Executable Files and -Source Code pursuant to this License but you may not repost or republish or -otherwise distribute or make available the Articles, without the prior written -consent of the Author. - -Any subroutines or modules supplied by You and linked into the Source Code -or Executable Files of this Work shall not be considered part of this Work -and will not be subject to the terms of this License. - -Patent License. Subject to the terms and conditions of this License, each -Author hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, -royalty-free, irrevocable (except as stated in this section) patent license -to make, have made, use, import, and otherwise transfer the Work. - -Restrictions. The license granted in Section 3 above is expressly made subject -to and limited by the following restrictions: - You agree not to remove any of the original copyright, patent, trademark, -and attribution notices and associated disclaimers that may appear in the -Source Code or Executable Files. - You agree not to advertise or in any way imply that this Work is a product -of Your own. - The name of the Author may not be used to endorse or promote products -derived from the Work without the prior written consent of the Author. - You agree not to sell, lease, or rent any part of the Work. This does -not restrict you from including the Work or any part of the Work inside -a larger software distribution that itself is being sold. The Work by itself, -though, cannot be sold, leased or rented. - You may distribute the Executable Files and Source Code only under the terms -of this License, and You must include a copy of, or the Uniform Resource -Identifier for, this License with every copy of the Executable Files or -Source Code You distribute and ensure that anyone receiving such Executable -Files and Source Code agrees that the terms of this License apply to such -Executable Files and/or Source Code. You may not offer or impose any terms -on the Work that alter or restrict the terms of this License or the -recipients' exercise of the rights granted hereunder. You may not sublicense -the Work. You must keep intact all notices that refer to this License and to -the disclaimer of warranties. You may not distribute the Executable Files or -Source Code with any technological measures that control access or use of the -Work in a manner inconsistent with the terms of this License. - You agree not to use the Work for illegal, immoral or improper -purposes, or on pages containing illegal, immoral or improper material. -The Work is subject to applicable export laws. You agree to comply with all -such laws and regulations that may apply to the Work after Your receipt of -the Work. - -Representations, Warranties and Disclaimer. THIS WORK IS PROVIDED "AS IS", -"WHERE IS" AND "AS AVAILABLE", WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OR -CONDITIONS OR GUARANTEES. YOU, THE USER, ASSUME ALL RISK IN ITS USE, -INCLUDING COPYRIGHT INFRINGEMENT, PATENT INFRINGEMENT, SUITABILITY, ETC. -AUTHOR EXPRESSLY DISCLAIMS ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES -OR CONDITIONS, INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS -OF MERCHANTABILITY, MERCHANTABLE QUALITY OR FITNESS FOR A PARTICULAR -PURPOSE, OR ANY WARRANTY OF TITLE OR NON-INFRINGEMENT, OR THAT THE WORK -(OR ANY PORTION THEREOF) IS CORRECT, USEFUL, BUG-FREE OR FREE OF VIRUSES. -YOU MUST PASS THIS DISCLAIMER ON WHENEVER YOU DISTRIBUTE THE WORK OR DERIVATIVE -WORKS. - -Indemnity. You agree to defend, indemnify and hold harmless the Author and the -Publisher from and against any claims, suits, losses, damages, liabilities, -costs, and expenses (including reasonable legal or attorneys’ fees) -resulting from or relating to any use of the Work by You. - -Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, -IN NO EVENT WILL THE AUTHOR OR THE PUBLISHER BE LIABLE TO YOU ON ANY LEGAL -THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY -DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK OR OTHERWISE, -EVEN IF THE AUTHOR OR THE PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY -OF SUCH DAMAGES. - -Termination. - This License and the rights granted hereunder will terminate -automatically upon any breach by You of any term of this License. -Individuals or entities who have received Derivative Works from You under -this License, however, will not have their licenses terminated provided such -individuals or entities remain in full compliance with those licenses. -Sections 1, 2, 6, 7, 8, 9, 10 and 11 will survive any termination of -this License. - If You bring a copyright, trademark, patent or any other infringement -claim against any contributor over infringements You claim are made by the -Work, your License from such contributor to the Work ends automatically. - Subject to the above terms and conditions, this License is perpetual -(for the duration of the applicable copyright in the Work). -Notwithstanding the above, the Author reserves the right to release the Work -under different license terms or to stop distributing the Work at any time; -provided, however that any such election will not serve to withdraw this -License (or any other license that has been, or is required to be, -granted under the terms of this License), and this License will continue -in full force and effect unless terminated as stated above. - -Publisher. The parties hereby confirm that the Publisher shall not, under -any circumstances, be responsible for and shall not have any liability -in respect of the subject matter of this License. The Publisher makes no -warranty whatsoever in connection with the Work and shall not be liable -to You or any party on any legal theory for any damages whatsoever, including -without limitation any general, special, incidental or consequential damages -arising in connection to this license. The Publisher reserves the right to -cease making the Work available to You at any time without notice - -Miscellaneous - This License shall be governed by the laws of the location of the head -office of the Author or if the Author is an individual, the laws of -location of the principal place of residence of the Author. - If any provision of this License is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of the -remainder of the terms of this License, and without further action by the -parties to this License, such provision shall be reformed to the minimum -extent necessary to make such provision valid and enforceable. - No term or provision of this License shall be deemed waived and no -breach consented to unless such waiver or consent shall be in writing -and signed by the party to be charged with such waiver or consent. - This License constitutes the entire agreement between the parties -with respect to the Work licensed herein. There are no understandings, -agreements or representations with respect to the Work not specified herein. -The Author shall not be bound by any additional provisions that may appear -in any communication from You. This License may not be modified without -the mutual written agreement of the Author and You. - - -With respect to DocumentFormat.OpenXml -====================================== - -(https://github.com/OfficeDev/Open-XML-SDK/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to ExcelNumberFormat -================================= - -(https://github.com/andersnm/ExcelNumberFormat/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2017 andersnm - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to jose-jwt -======================== - -(https://github.com/dvsekhvalnov/jose-jwt/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014-2019 dvsekhvalnov - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With resepect to ExcelDataReader -================================ - -(https://github.com/ExcelDataReader/ExcelDataReader/blob/develop/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014 ExcelDataReader - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepect to OPC UA Example Code -==================================== - - * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved. - * - * OPC Foundation MIT License 1.00 - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * The complete license agreement can be found here: - * http://opcfoundation.org/License/MIT/1.00/ - - -With respect to OPC Foundation -============================== - -RCL License -Reciprocal Community License 1.00 (RCL1.00) -Version 1.00, June 24, 2009 -Copyright (C) 2008,2009 OPC Foundation, Inc., All Rights Reserved. - -https://opcfoundation.org/license/rcl.html - -Remark: PHOENIX CONTACT GmbH & Co. KG and Festo SE & Co. KG are members -of OPC foundation. - -With respect to MSAGL (Microsoft Automatic Graph Layout) -======================================================== -(see: https://github.com/microsoft/automatic-graph-layout/blob/master/LICENSE) - -Microsoft Automatic Graph Layout, MSAGL - -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -""Software""), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With respect to Glob (https://www.nuget.org/packages/Glob/) -=========================================================== -(see: https://raw.githubusercontent.com/kthompson/glob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2013-2019 Kevin Thompson - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to Magick.NET -========================== - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -With respect to SSharp.NET library -================================== - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/src/WpfMtpVisuViewer/MainWindow.xaml b/src/WpfMtpVisuViewer/MainWindow.xaml deleted file mode 100644 index b8750c709..000000000 --- a/src/WpfMtpVisuViewer/MainWindow.xaml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (c) 2019 by Michael Hoffmeister, Festo AG & Co. KG - - - diff --git a/src/WpfMtpVisuViewer/MainWindow.xaml.cs b/src/WpfMtpVisuViewer/MainWindow.xaml.cs deleted file mode 100644 index dd1c72647..000000000 --- a/src/WpfMtpVisuViewer/MainWindow.xaml.cs +++ /dev/null @@ -1,365 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; -using AasxIntegrationBase; -using Newtonsoft.Json; -using WpfMtpControl; -using WpfMtpControl.DataSources; - -namespace WpfMtpVisuViewer -{ - public partial class MainWindow : Window - { - public WpfMtpControl.MtpVisuOpcUaClient client = new WpfMtpControl.MtpVisuOpcUaClient(); - - public AasOpcUaClient testOpcUaClient = null; - - public MainWindow() - { - // start - InitializeComponent(); - - // Timer for status - System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer(); - // ReSharper disable once RedundantDelegateCreation - dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick); - dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 100); - dispatcherTimer.Start(); - - // explicit - //// textOpcUaClient = new AasOpcUaClient("opc.tcp://127.0.0.1:4840" /* "localhost:4840" */, - //// _autoAccept: true, _stopTimeout : 99, _userName: "", _password: ""); - //// textOpcUaClient.Run(); - } - - public void SetMessage(string fmt, params object[] args) - { - var st = string.Format(fmt, args); - this.labelMessages.Text = st; - } - - private int opcCounter = 0; - - private void dispatcherTimer_Tick(object sender, EventArgs e) - { - if (this.client == null) - textBoxDataSourceStatus.Text = "(no OPC UA client enabled)"; - else - { - this.client.Tick(100); - textBoxDataSourceStatus.Text = this.client.GetStatus(); - } - - - // TODO (MIHO, 2020-09-18): remove this test code - opcCounter++; - if (testOpcUaClient != null && opcCounter % 20 == 0) - try - { - // ReSharper disable once UnusedVariable - var x = testOpcUaClient.ReadSubmodelElementValueAsString( - "|var|CODESYS Control Win V3.Application.SENSORS.L001.V", 2); - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); - } - - if (testOpcUaClient != null && opcCounter % 100 == 0) - try - { - testOpcUaClient.Cancel(); - testOpcUaClient.Close(); - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); - } - } - - private WpfMtpControl.MtpData activeMtpData = null; - - private MtpDataSourceSubscriber activeSubscriber = null; - - private MtpSymbolMapRecordList hintsForConfigRecs = null; - - private void LoadFile(string fn) - { - if (!".aml .zip .mtp".Contains(System.IO.Path.GetExtension(fn.Trim().ToLower()))) - return; - this.client = new WpfMtpControl.MtpVisuOpcUaClient(); - this.client.ItemChanged += Client_ItemChanged; - this.activeSubscriber = new MtpDataSourceSubscriber(); - this.activeMtpData = new WpfMtpControl.MtpData(); - this.hintsForConfigRecs = new MtpSymbolMapRecordList(); - - mtpVisu.VisuOptions = this.theOptions.VisuOptions; - this.activeMtpData.LoadAmlOrMtp(activeVisualObjectLib, this.client, this.theOptions.PreLoadInfo, - this.activeSubscriber, fn, makeUpConfigRecs: hintsForConfigRecs); - if (this.activeMtpData.PictureCollection.Count > 0) - mtpVisu.SetPicture(this.activeMtpData.PictureCollection.Values.ElementAt(0)); - mtpVisu.RedrawMtp(); - this.Title = "WPF MTP Viewer prototype - " + fn; - } - - private void Client_ItemChanged(WpfMtpControl.DataSources.IMtpDataSourceStatus dataSource, - MtpVisuOpcUaClient.DetailItem itemRef, MtpVisuOpcUaClient.ItemChangeType changeType) - { - if (dataSource == null || itemRef == null || itemRef.MtpSourceItemId == null - || this.activeSubscriber == null) - return; - - if (changeType == MtpVisuOpcUaClient.ItemChangeType.Value) - this.activeSubscriber.Invoke(itemRef.MtpSourceItemId, MtpDataSourceSubscriber.ChangeType.Value, - itemRef.Value); - } - - private WpfMtpControl.MtpSymbolLib theSymbolLib = null; - - private WpfMtpControl.MtpVisualObjectLib activeVisualObjectLib = null; - - // ReSharper disable once ClassNeverInstantiated.Global - public class MtpViewerStandaloneOptions : AasxIntegrationBase.AasxPluginOptionsBase - { - public WpfMtpControl.MtpSymbolMapRecordList SymbolMappings = new WpfMtpControl.MtpSymbolMapRecordList(); - public MtpDataSourceOpcUaPreLoadInfo PreLoadInfo = new MtpDataSourceOpcUaPreLoadInfo(); - public MtpVisuOptions VisuOptions = new MtpVisuOptions(); - } - - private MtpViewerStandaloneOptions theOptions = null; - - private void Window_Loaded(object sender, RoutedEventArgs e) - { - // start - SetMessage("Application started."); - - // initialize symbol library - this.theSymbolLib = new MtpSymbolLib(); - - var ISO10628 = new ResourceDictionary(); - ISO10628.Source = new Uri( - "pack://application:,,,/WpfMtpControl;component/Resources/PNID_DIN_EN_ISO_10628.xaml"); - this.theSymbolLib.ImportResourceDicrectory("PNID_ISO10628", ISO10628); - - var FESTO = new ResourceDictionary(); - FESTO.Source = new Uri( - "pack://application:,,,/WpfMtpControl;component/Resources/PNID_Festo.xaml"); - this.theSymbolLib.ImportResourceDicrectory("PNID_Festo", FESTO); - - // initialize visual object libraries - activeVisualObjectLib = new WpfMtpControl.MtpVisualObjectLib(); - activeVisualObjectLib.LoadStatic(this.theSymbolLib); - - // to find options - this.theOptions = AasxPluginOptionsBase.LoadDefaultOptionsFromAssemblyDir( - "WpfMtpVisuViewer", Assembly.GetExecutingAssembly()); - if (this.theOptions != null && this.theOptions.SymbolMappings != null) - { - activeVisualObjectLib.LoadFromSymbolMappings(this.theSymbolLib, this.theOptions.SymbolMappings); - SetMessage("Options loaded."); - } - - // load file - try - { - //// LoadFile("Dosing.mtp"); - //// LoadFile("Manifest_PxC_Dosing.aml"); - LoadFile("Manifest_V18.10.31_3_better_name_win3.aml"); - //// LoadFile("Manifest_Sten1.aml"); - //// LoadFile("Manifest_ChemiReaktor_MIHO.aml"); - - SetMessage("MTP file loaded."); - } - catch (Exception ex) - { - SetMessage("Exception: {0}", ex.Message); - } - - // fit it - this.mtpVisu.ZoomToFitCanvas(); - - // double click handler - this.mtpVisu.MtpObjectDoubleClick += MtpVisu_MtpObjectDoubleClick; - } - - private void MtpVisu_MtpObjectDoubleClick(MtpData.MtpBaseObject source) - { - if (source == null) - return; - SetMessage("DblClick name {0} RefID {1}", source.Name, source.RefID); - } - - private void Window_DragEnter(object sender, DragEventArgs e) - { - if (!e.Data.GetDataPresent("myFormat") || sender == e.Source) - { - e.Effects = DragDropEffects.None; - } - } - - private void Window_Drop(object sender, DragEventArgs e) - { - if (e.Data.GetDataPresent(DataFormats.FileDrop, true)) - { - // Note that you can have more than one file. - string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); - - // Assuming you have one file that you care about, pass it off to whatever - // handling code you have defined. - if (files != null && files.Length > 0) - { - try - { - LoadFile(files[0]); - } - catch (Exception ex) - { - SetMessage("Exception: {0}", ex.Message); - } - } - } - } - - private void Window_SizeChanged(object sender, SizeChangedEventArgs e) - { - // fit it - this.mtpVisu?.ZoomToFitCanvas(); - } - - private int overlayPanelMode = 0; - - private void SetOverlayPanelMode(int newMode) - { - this.overlayPanelMode = newMode; - - switch (this.overlayPanelMode) - { - case 2: - this.ScrollViewerDataSources.Visibility = Visibility.Visible; - DataGridDataSources.ItemsSource = this.client.Items; - this.RichTextReport.Visibility = Visibility.Collapsed; - break; - - case 1: - this.ScrollViewerDataSources.Visibility = Visibility.Collapsed; - DataGridDataSources.ItemsSource = null; - this.RichTextReport.Visibility = Visibility.Visible; - ReportOnConfiguration(this.RichTextReport); - break; - - default: - this.ScrollViewerDataSources.Visibility = Visibility.Collapsed; - DataGridDataSources.ItemsSource = null; - this.RichTextReport.Visibility = Visibility.Collapsed; - break; - } - } - - private void Button_Click(object sender, RoutedEventArgs e) - { - if (sender == buttonDataSourceDetails) - { - if (this.overlayPanelMode != 2) - SetOverlayPanelMode(2); - else - SetOverlayPanelMode(0); - } - - if (sender == buttonConfig) - { - if (this.overlayPanelMode != 1) - SetOverlayPanelMode(1); - else - SetOverlayPanelMode(0); - } - } - - private void AddToRichTextBox(RichTextBox rtb, string text, bool bold = false, double? fontSize = null, - bool monoSpaced = false) - { - var p = new Paragraph(); - if (bold) - p.FontWeight = FontWeights.Bold; - if (fontSize.HasValue) - p.FontSize = fontSize.Value; - if (monoSpaced) - p.FontFamily = new FontFamily("Courier New"); - p.Inlines.Add(new Run(text)); - rtb.Document.Blocks.Add(p); - } - - private void ReportOnConfiguration(RichTextBox rtb) - { - // access - if (rtb == null) - return; - - rtb.Document.Blocks.Clear(); - - // - // Report on available library symbols - // - - if (this.theSymbolLib != null) - { - - AddToRichTextBox(rtb, "Library symbols", bold: true, fontSize: 18); - - AddToRichTextBox(rtb, "The following lists shows available symbol full names."); - - foreach (var x in this.theSymbolLib.Values) - { - AddToRichTextBox(rtb, "" + x.FullName, monoSpaced: true); - } - - AddToRichTextBox(rtb, ""); - } - - // - // Hints for configurations - // - - if (this.hintsForConfigRecs != null) - { - AddToRichTextBox(rtb, "Preformatted configuration records", bold: true, fontSize: 18); - AddToRichTextBox(rtb, - "The following JSON elements could be pasted into the options file named " + "" + - "'AasxPluginMtpViewer.options.json'. " + - "Prior to pasting, an appropriate symbol full name needs to be chosen from above list. " + - "For the eClass strings, multiples choices can be delimited by ';'. " + - "For EClassVersions, 'null' disables version checking. " + - "Either EClassClasses or EClassIRDIs shall be different to 'null'."); - - foreach (var x in this.hintsForConfigRecs) - { - var txt = JsonConvert.SerializeObject(x, Formatting.None); - AddToRichTextBox(rtb, "" + txt, monoSpaced: true); - } - - AddToRichTextBox(rtb, ""); - } - } - } -} diff --git a/src/WpfMtpVisuViewer/Opc.Ua.SampleClient.Config.xml b/src/WpfMtpVisuViewer/Opc.Ua.SampleClient.Config.xml deleted file mode 100644 index 8c8ea824f..000000000 --- a/src/WpfMtpVisuViewer/Opc.Ua.SampleClient.Config.xml +++ /dev/null @@ -1,99 +0,0 @@ - - - UA Core Sample Client - urn:localhost:OPCFoundation:CoreSampleClient - http://opcfoundation.org/UA/CoreSampleClient - Client_1 - - - - - - X509Store - CurrentUser\My - CN=UA Core Sample Client, C=US, S=Arizona, O=OPC Foundation, DC=localhost - - - - - Directory - %LocalApplicationData%/OPC Foundation/pki/issuer - - - - - Directory - %LocalApplicationData%/OPC Foundation/pki/trusted - - - - - Directory - %LocalApplicationData%/OPC Foundation/pki/rejected - - - - false - - - - - - - 600000 - 1048576 - 4194304 - 65535 - 4194304 - 65535 - 300000 - 3600000 - - - - - - - 600000 - - - - opc.tcp://{0}:4840/UADiscovery - - - - - - - 10000 - - - - %LocalApplicationData%/Logs/Opc.Ua.CoreSampleClient.log.txt - true - - - - - - - - - - - - - - - - true - - \ No newline at end of file diff --git a/src/WpfMtpVisuViewer/Properties/AssemblyInfo.cs b/src/WpfMtpVisuViewer/Properties/AssemblyInfo.cs deleted file mode 100644 index a0aac0e74..000000000 --- a/src/WpfMtpVisuViewer/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System.Reflection; -using System.Resources; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Windows; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die einer Assembly zugeordnet sind. -[assembly: AssemblyTitle("WpfMtpVisuViewer")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("WpfMtpVisuViewer")] -[assembly: AssemblyCopyright("Copyright © 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly -// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von -// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. -[assembly: ComVisible(false)] - -//Um mit dem Erstellen lokalisierbarer Anwendungen zu beginnen, legen Sie -//ImCodeVerwendeteKultur in der .csproj-Datei -//in einer fest. Wenn Sie in den Quelldateien beispielsweise Deutsch -//(Deutschland) verwenden, legen Sie auf \"de-DE\" fest. Heben Sie dann die Auskommentierung -//des nachstehenden NeutralResourceLanguage-Attributs auf. Aktualisieren Sie "en-US" in der nachstehenden Zeile, -//sodass es mit der UICulture-Einstellung in der Projektdatei übereinstimmt. - -//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] - - -[assembly: ThemeInfo( - ResourceDictionaryLocation.None, //Speicherort der designspezifischen Ressourcenwörterbücher - //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, - // oder in den Anwendungsressourcen-Wörterbüchern nicht gefunden werden kann.) - ResourceDictionaryLocation.SourceAssembly //Speicherort des generischen Ressourcenwörterbuchs - //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, - // designspezifischen Ressourcenwörterbuch nicht gefunden werden kann.) -)] - - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, -// übernehmen, indem Sie "*" eingeben: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/WpfMtpVisuViewer/Properties/Resources.Designer.cs b/src/WpfMtpVisuViewer/Properties/Resources.Designer.cs deleted file mode 100644 index 6be4c80c5..000000000 --- a/src/WpfMtpVisuViewer/Properties/Resources.Designer.cs +++ /dev/null @@ -1,71 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Dieser Code wurde von einem Tool generiert. -// Laufzeitversion: 4.0.30319.42000 -// -// Änderungen an dieser Datei können fehlerhaftes Verhalten verursachen und gehen verloren, wenn -// der Code neu generiert wird. -// -//------------------------------------------------------------------------------ - -namespace WpfMtpVisuViewer.Properties -{ - - - /// - /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. - /// - // Diese Klasse wurde von der StronglyTypedResourceBuilder-Klasse - // über ein Tool wie ResGen oder Visual Studio automatisch generiert. - // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen - // mit der Option /str erneut aus, oder erstellen Sie Ihr VS-Projekt neu. - [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() - { - } - - /// - /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. - /// - [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("WpfMtpVisuViewer.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle - /// Ressourcenlookups, die diese stark typisierte Ressourcenklasse verwenden. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { - return resourceCulture; - } - set - { - resourceCulture = value; - } - } - } -} diff --git a/src/WpfMtpVisuViewer/Properties/Resources.resx b/src/WpfMtpVisuViewer/Properties/Resources.resx deleted file mode 100644 index af7dbebba..000000000 --- a/src/WpfMtpVisuViewer/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/src/WpfMtpVisuViewer/Properties/Settings.Designer.cs b/src/WpfMtpVisuViewer/Properties/Settings.Designer.cs deleted file mode 100644 index c4fe9e2f4..000000000 --- a/src/WpfMtpVisuViewer/Properties/Settings.Designer.cs +++ /dev/null @@ -1,30 +0,0 @@ -//------------------------------------------------------------------------------ -// -// 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. -// -//------------------------------------------------------------------------------ - -namespace WpfMtpVisuViewer.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; - } - } - } -} diff --git a/src/WpfMtpVisuViewer/Properties/Settings.settings b/src/WpfMtpVisuViewer/Properties/Settings.settings deleted file mode 100644 index 033d7a5e9..000000000 --- a/src/WpfMtpVisuViewer/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/WpfMtpVisuViewer/WpfMtpVisuViewer.csproj b/src/WpfMtpVisuViewer/WpfMtpVisuViewer.csproj deleted file mode 100644 index 79ec97e63..000000000 --- a/src/WpfMtpVisuViewer/WpfMtpVisuViewer.csproj +++ /dev/null @@ -1,31 +0,0 @@ - - - net6.0-windows - WinExe - false - true - false - - - - PreserveNewest - - - - - - - - - PreserveNewest - - - - - PreserveNewest - - - - - - diff --git a/src/WpfMtpVisuViewer/WpfMtpVisuViewer.options.json b/src/WpfMtpVisuViewer/WpfMtpVisuViewer.options.json deleted file mode 100644 index 72df7574b..000000000 --- a/src/WpfMtpVisuViewer/WpfMtpVisuViewer.options.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "SymbolMappings": [ - { - "EClassVersions": null, - "EClassClasses": "37010201", - "EClassIRDIs": null, - "SymbolDefault": "PNID_Festo.manual_valve_default-u-nozzled" - } - ], - "PreLoadInfo": { - "EndpointMapping": [ - { - "ForName": "CPX1_CEC", - "NewEndpoint": "opc.tcp://127.0.0.1:4841" - } - ], - "IdentifierRenaming": [ - { - "OldText": "\\|var\\|CODESYS Control Win V31.Application.SERVICE.Dosing_duration.WQC", - "NewText": "|var|CODESYS Control Win V31.Application.SERVICE.Dosing_duration.WQC" - } - ], - "NamespaceRenaming": [] - }, - "VisuOptions": { - "Background": "#707070", - "StateColorActive": "#2020ff", - "StateColorNonActive": "#202020", - "StateColorForward": "#2020ff", - "StateColorReverse": "#20ff20" - } -} \ No newline at end of file From b3fa722f993c7b3abcab36d1b98bacc092072123 Mon Sep 17 00:00:00 2001 From: Alexander Wollbrink Date: Fri, 12 Jul 2024 11:51:41 +0200 Subject: [PATCH 11/13] remove AasxPluginMtpViewer --- src/AasxPackageExplorer.sln | 165 ----- .../AasxPluginMtpViewer.csproj | 41 -- .../AasxPluginMtpViewer.options.json | 46 -- .../AasxPluginMtpViewer.plugin | 1 - src/AasxPluginMtpViewer/LICENSE.TXT | 244 ------- src/AasxPluginMtpViewer/MtpViewerOptions.cs | 61 -- .../Opc.Ua.SampleClient.Config.xml | 99 --- src/AasxPluginMtpViewer/Plugin.cs | 155 ----- .../Properties/AssemblyInfo.cs | 55 -- .../Properties/Resources.Designer.cs | 62 -- .../Properties/Resources.resx | 117 ---- .../Properties/Settings.Designer.cs | 30 - .../Properties/Settings.settings | 7 - src/AasxPluginMtpViewer/Resources/LICENSE.TXT | 651 ------------------ .../WpfMtpControlWrapper.xaml | 65 -- .../WpfMtpControlWrapper.xaml.cs | 505 -------------- 16 files changed, 2304 deletions(-) delete mode 100644 src/AasxPluginMtpViewer/AasxPluginMtpViewer.csproj delete mode 100644 src/AasxPluginMtpViewer/AasxPluginMtpViewer.options.json delete mode 100644 src/AasxPluginMtpViewer/AasxPluginMtpViewer.plugin delete mode 100644 src/AasxPluginMtpViewer/LICENSE.TXT delete mode 100644 src/AasxPluginMtpViewer/MtpViewerOptions.cs delete mode 100644 src/AasxPluginMtpViewer/Opc.Ua.SampleClient.Config.xml delete mode 100644 src/AasxPluginMtpViewer/Plugin.cs delete mode 100644 src/AasxPluginMtpViewer/Properties/AssemblyInfo.cs delete mode 100644 src/AasxPluginMtpViewer/Properties/Resources.Designer.cs delete mode 100644 src/AasxPluginMtpViewer/Properties/Resources.resx delete mode 100644 src/AasxPluginMtpViewer/Properties/Settings.Designer.cs delete mode 100644 src/AasxPluginMtpViewer/Properties/Settings.settings delete mode 100644 src/AasxPluginMtpViewer/Resources/LICENSE.TXT delete mode 100644 src/AasxPluginMtpViewer/WpfMtpControlWrapper.xaml delete mode 100644 src/AasxPluginMtpViewer/WpfMtpControlWrapper.xaml.cs diff --git a/src/AasxPackageExplorer.sln b/src/AasxPackageExplorer.sln index e321a4197..6cc15bb6f 100644 --- a/src/AasxPackageExplorer.sln +++ b/src/AasxPackageExplorer.sln @@ -12,10 +12,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxToolkit", "AasxToolkit\ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxWpfControlLibrary", "AasxWpfControlLibrary\AasxWpfControlLibrary.csproj", "{EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxRestServerLibrary", "AasxRestServerLibrary\AasxRestServerLibrary.csproj", "{967E60E3-D668-42A3-AA0B-1A031C20D871}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxRestConsoleServer", "AasxRestConsoleServer\AasxRestConsoleServer.csproj", "{6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxIntegrationBase", "AasxIntegrationBase\AasxIntegrationBase.csproj", "{5A05DF78-216B-4A0B-9E30-7B2557C7E867}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxIntegrationEmptySample", "AasxIntegrationEmptySample\AasxIntegrationEmptySample.csproj", "{7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B}" @@ -77,12 +73,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ProgsUserInterface", "Progs EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DataStore", "DataStore", "{9490C085-8FDC-4EDE-BDCF-280FC19E43FF}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WpfMtpControl", "WpfMtpControl\WpfMtpControl.csproj", "{F6CF3948-C67A-40FC-812A-3733F673EA21}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginMtpViewer", "AasxPluginMtpViewer\AasxPluginMtpViewer.csproj", "{7A612803-BAE2-4FED-BBCE-56079EDB8594}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WpfMtpVisuViewer", "WpfMtpVisuViewer\WpfMtpVisuViewer.csproj", "{1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "FunctionalUiLibs", "FunctionalUiLibs", "{C1752DB5-0157-4666-A25D-2666089457BB}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UserSpecific", "UserSpecific", "{4FD813E9-EC97-4E85-BAFC-5280BC07C302}" @@ -256,66 +246,6 @@ Global {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|Any CPU.Build.0 = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|x64.ActiveCfg = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|x64.Build.0 = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|x86.ActiveCfg = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Debug|x86.Build.0 = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugSlow|x64.ActiveCfg = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugSlow|x64.Build.0 = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugSlow|x86.ActiveCfg = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugSlow|x86.Build.0 = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|Any CPU.ActiveCfg = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|Any CPU.Build.0 = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|x64.ActiveCfg = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|x64.Build.0 = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|x86.ActiveCfg = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.Release|x86.Build.0 = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {967E60E3-D668-42A3-AA0B-1A031C20D871}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|x64.ActiveCfg = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|x64.Build.0 = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|x86.ActiveCfg = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Debug|x86.Build.0 = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugSlow|x64.ActiveCfg = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugSlow|x64.Build.0 = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugSlow|x86.ActiveCfg = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugSlow|x86.Build.0 = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|Any CPU.Build.0 = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|x64.ActiveCfg = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|x64.Build.0 = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|x86.ActiveCfg = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.Release|x86.Build.0 = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Debug|Any CPU.Build.0 = Debug|Any CPU {5A05DF78-216B-4A0B-9E30-7B2557C7E867}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -884,96 +814,6 @@ Global {B540EBF4-C026-45A4-9721-909AF0CC14C1}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU {B540EBF4-C026-45A4-9721-909AF0CC14C1}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU {B540EBF4-C026-45A4-9721-909AF0CC14C1}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|x64.ActiveCfg = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|x64.Build.0 = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|x86.ActiveCfg = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Debug|x86.Build.0 = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugSlow|x64.ActiveCfg = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugSlow|x64.Build.0 = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugSlow|x86.ActiveCfg = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugSlow|x86.Build.0 = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|Any CPU.Build.0 = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|x64.ActiveCfg = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|x64.Build.0 = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|x86.ActiveCfg = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.Release|x86.Build.0 = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {F6CF3948-C67A-40FC-812A-3733F673EA21}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|x64.ActiveCfg = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|x64.Build.0 = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|x86.ActiveCfg = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Debug|x86.Build.0 = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugSlow|x64.ActiveCfg = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugSlow|x64.Build.0 = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugSlow|x86.ActiveCfg = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugSlow|x86.Build.0 = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|Any CPU.Build.0 = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|x64.ActiveCfg = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|x64.Build.0 = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|x86.ActiveCfg = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.Release|x86.Build.0 = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {7A612803-BAE2-4FED-BBCE-56079EDB8594}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|x64.ActiveCfg = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|x64.Build.0 = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|x86.ActiveCfg = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Debug|x86.Build.0 = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugSlow|x64.ActiveCfg = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugSlow|x64.Build.0 = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugSlow|x86.ActiveCfg = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugSlow|x86.Build.0 = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|Any CPU.Build.0 = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|x64.ActiveCfg = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|x64.Build.0 = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|x86.ActiveCfg = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.Release|x86.Build.0 = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|Any CPU.Build.0 = Debug|Any CPU {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -1792,8 +1632,6 @@ Global {569B369E-9393-4F57-994E-6B84398FD7CC} = {98C89299-C429-4F0B-9938-4B7775943393} {294FC59A-5645-412F-8216-702FB66528C1} = {1A282279-9375-4714-96B6-89A00985C9DC} {EBAE658A-3ECE-4C98-89BC-F79809AB4A5E} = {98C89299-C429-4F0B-9938-4B7775943393} - {967E60E3-D668-42A3-AA0B-1A031C20D871} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {6C45112D-B7F0-4463-BE6D-A8A2B5A547BF} = {1A282279-9375-4714-96B6-89A00985C9DC} {5A05DF78-216B-4A0B-9E30-7B2557C7E867} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} {7B8F763F-39FE-4947-B0E6-B9D97A3B6F8B} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} {6D1A03B2-EBA7-4CE2-9237-DF9AD7128947} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} @@ -1813,9 +1651,6 @@ Global {7788AC2B-7F97-4755-B343-C4196FA90198} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} {B540EBF4-C026-45A4-9721-909AF0CC14C1} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {F6CF3948-C67A-40FC-812A-3733F673EA21} = {C1752DB5-0157-4666-A25D-2666089457BB} - {7A612803-BAE2-4FED-BBCE-56079EDB8594} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} - {1E2E9A75-3C8C-4CD9-BE11-32190FD4313C} = {98C89299-C429-4F0B-9938-4B7775943393} {4FD813E9-EC97-4E85-BAFC-5280BC07C302} = {9264D68F-5269-420F-A486-6B8F39BEEB8B} {96FBCF5F-BBF3-4076-8DB6-BF9D8420F3DC} = {98C89299-C429-4F0B-9938-4B7775943393} {8D09D103-1B97-4D54-BAA9-841B2F93FF36} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} diff --git a/src/AasxPluginMtpViewer/AasxPluginMtpViewer.csproj b/src/AasxPluginMtpViewer/AasxPluginMtpViewer.csproj deleted file mode 100644 index 16174b82f..000000000 --- a/src/AasxPluginMtpViewer/AasxPluginMtpViewer.csproj +++ /dev/null @@ -1,41 +0,0 @@ - - - net6.0-windows - library - false - true - - - - true - false - - - - PreserveNewest - - - PreserveNewest - - - - - - - - - - - - - - - - - PreserveNewest - - - - - - diff --git a/src/AasxPluginMtpViewer/AasxPluginMtpViewer.options.json b/src/AasxPluginMtpViewer/AasxPluginMtpViewer.options.json deleted file mode 100644 index 5cba39956..000000000 --- a/src/AasxPluginMtpViewer/AasxPluginMtpViewer.options.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "Records": [ - { - "RecordType": 0, - "AllowSubmodelSemanticId": [ - { - "type": "Submodel", - "local": false, - "value": "http://www.admin-shell.io/mtp/v1/submodel", - "index": 0, - "idType": "IRI" - } - ] - }, - { - "RecordType": 1, - "AllowSubmodelSemanticId": [ - { - "type": "Submodel", - "local": false, - "value": "http://www.admin-shell.io/mtp/v1/mtp-instance-submodel", - "index": 0, - "idType": "IRI" - } - ] - } - ], - "SymbolMappings": [ - { - "EClassVersions": null, - "EClassClasses": "37010201", - "EClassIRDIs": null, - "SymbolDefault": "PNID_Festo.manual_valve_active-u-nozzled", - "SymbolActive": null, - "SymbolIntermediate": null, - "Comment": "V003,45fd1be7-d9fe-426a-aec7-ca16a09cb64b" - } - ], - "VisuOptions": { - "Background": "#707070", - "StateColorActive": "#2020ff", - "StateColorNonActive": "#202020", - "StateColorForward": "#2020ff", - "StateColorReverse": "#20ff20" - } -} \ No newline at end of file diff --git a/src/AasxPluginMtpViewer/AasxPluginMtpViewer.plugin b/src/AasxPluginMtpViewer/AasxPluginMtpViewer.plugin deleted file mode 100644 index 3beebdf2d..000000000 --- a/src/AasxPluginMtpViewer/AasxPluginMtpViewer.plugin +++ /dev/null @@ -1 +0,0 @@ -This file tags the according .ddl to be a plug-in for AasxPackageExplorer. \ No newline at end of file diff --git a/src/AasxPluginMtpViewer/LICENSE.TXT b/src/AasxPluginMtpViewer/LICENSE.TXT deleted file mode 100644 index 21bf04b1f..000000000 --- a/src/AasxPluginMtpViewer/LICENSE.TXT +++ /dev/null @@ -1,244 +0,0 @@ -Copyright (c) 2018-2023 Festo SE & Co. KG -, -author: Michael Hoffmeister - -This software is licensed under the Apache Public License 2.0 (APL-2.0) -(see below). -The AutomationML.Engine is licensed under the MIT license (MIT) -(see below). - -This application is a sample application for demonstration of the features -of the Administration Shell. -It is not allowed for productive use. The implementation uses the concepts -of the document "Details of the Asset -Administration Shell" published on www.plattform-i40.de which is licensed -under Creative Commons CC BY-ND 3.0 DE. - -The MIT License (MIT) - -Copyright (c) 2007 James Newton-King - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to AutomationML.Engine -=================================== - -(https://raw.githubusercontent.com/AutomationML/AMLEngine2.1/master/license.txt) - -The MIT License (MIT) - -Copyright 2017 AutomationML e.V. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - diff --git a/src/AasxPluginMtpViewer/MtpViewerOptions.cs b/src/AasxPluginMtpViewer/MtpViewerOptions.cs deleted file mode 100644 index 66086a5ca..000000000 --- a/src/AasxPluginMtpViewer/MtpViewerOptions.cs +++ /dev/null @@ -1,61 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using AasxPredefinedConcepts; -using Aas = AasCore.Aas3_0; -using AdminShellNS; -using Extensions; -using WpfMtpControl; -using AasxIntegrationBase; - -namespace AasxPluginMtpViewer -{ - public class MtpViewerOptionsRecord : AasxPluginOptionsLookupRecordBase - { - public enum MtpRecordType { MtpType, MtpInstance } - - public MtpRecordType RecordType = MtpRecordType.MtpType; - } - - public class MtpViewerOptions : AasxPluginLookupOptionsBase - { - public List Records = new List(); - - public WpfMtpControl.MtpSymbolMapRecordList SymbolMappings = new WpfMtpControl.MtpSymbolMapRecordList(); - - public MtpVisuOptions VisuOptions = new MtpVisuOptions(); - - /// - /// Create a set of minimal options - /// - public static MtpViewerOptions CreateDefault() - { - var defs = new DefinitionsMTP.ModuleTypePackage(); - - var rec1 = new MtpViewerOptionsRecord(); - rec1.RecordType = MtpViewerOptionsRecord.MtpRecordType.MtpType; - rec1.AllowSubmodelSemanticId = defs.SEM_MtpSubmodel.Keys.ToKeyList(); - - var rec2 = new MtpViewerOptionsRecord(); - rec2.RecordType = MtpViewerOptionsRecord.MtpRecordType.MtpInstance; - rec2.AllowSubmodelSemanticId = defs.SEM_MtpInstanceSubmodel.Keys.ToKeyList(); - - var opt = new MtpViewerOptions(); - opt.Records.Add(rec1); - opt.Records.Add(rec2); - - return opt; - } - } -} diff --git a/src/AasxPluginMtpViewer/Opc.Ua.SampleClient.Config.xml b/src/AasxPluginMtpViewer/Opc.Ua.SampleClient.Config.xml deleted file mode 100644 index 8c8ea824f..000000000 --- a/src/AasxPluginMtpViewer/Opc.Ua.SampleClient.Config.xml +++ /dev/null @@ -1,99 +0,0 @@ - - - UA Core Sample Client - urn:localhost:OPCFoundation:CoreSampleClient - http://opcfoundation.org/UA/CoreSampleClient - Client_1 - - - - - - X509Store - CurrentUser\My - CN=UA Core Sample Client, C=US, S=Arizona, O=OPC Foundation, DC=localhost - - - - - Directory - %LocalApplicationData%/OPC Foundation/pki/issuer - - - - - Directory - %LocalApplicationData%/OPC Foundation/pki/trusted - - - - - Directory - %LocalApplicationData%/OPC Foundation/pki/rejected - - - - false - - - - - - - 600000 - 1048576 - 4194304 - 65535 - 4194304 - 65535 - 300000 - 3600000 - - - - - - - 600000 - - - - opc.tcp://{0}:4840/UADiscovery - - - - - - - 10000 - - - - %LocalApplicationData%/Logs/Opc.Ua.CoreSampleClient.log.txt - true - - - - - - - - - - - - - - - - true - - \ No newline at end of file diff --git a/src/AasxPluginMtpViewer/Plugin.cs b/src/AasxPluginMtpViewer/Plugin.cs deleted file mode 100644 index b88929648..000000000 --- a/src/AasxPluginMtpViewer/Plugin.cs +++ /dev/null @@ -1,155 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; -using Aas = AasCore.Aas3_0; -using AdminShellNS; -using Extensions; -using Newtonsoft.Json; -using AasxPluginMtpViewer; - -namespace AasxIntegrationBase // the namespace has to be: AasxIntegrationBase -{ - // the class names has to be: AasxPlugin and subclassing IAasxPluginInterface - // ReSharper disable UnusedType.Global - public class AasxPlugin : AasxPluginBase - // ReSharper enable UnusedType.Global - { - private AasxPluginMtpViewer.MtpViewerOptions _options = new AasxPluginMtpViewer.MtpViewerOptions(); - - private AasxPluginMtpViewer.WpfMtpControlWrapper _viewerControl - = new AasxPluginMtpViewer.WpfMtpControlWrapper(); - - public new void InitPlugin(string[] args) - { - // start .. - PluginName = "AasxPluginMtpViewer"; - _log.Info("InitPlugin() called with args = {0}", (args == null) ? "" : string.Join(", ", args)); - - // .. with built-in options - _options = AasxPluginMtpViewer.MtpViewerOptions.CreateDefault(); - - // try load defaults options from assy directory - try - { - var newOpt = - AasxPluginOptionsBase.LoadDefaultOptionsFromAssemblyDir( - this.GetPluginName(), Assembly.GetExecutingAssembly()); - if (newOpt != null) - this._options = newOpt; - } - catch (Exception ex) - { - _log.Error(ex, "Exception when reading default options {1}"); - } - - // index them! - _options.IndexListOfRecords(_options.Records); - } - - public new AasxPluginActionDescriptionBase[] ListActions() - { - _log.Info("ListActions() called"); - var res = new List(); - // for speed reasons, have the most often used at top! - res.Add(new AasxPluginActionDescriptionBase("call-check-visual-extension", - "When called with Referable, returns possibly visual extension for it.")); - // rest follows - res.Add(new AasxPluginActionDescriptionBase("set-json-options", - "Sets plugin-options according to provided JSON string.")); - res.Add(new AasxPluginActionDescriptionBase("get-json-options", "Gets plugin-options as a JSON string.")); - res.Add(new AasxPluginActionDescriptionBase("get-licenses", "Reports about used licenses.")); - res.Add(new AasxPluginActionDescriptionBase("get-events", - "Pops and returns the earliest event from the event stack.")); - res.Add(new AasxPluginActionDescriptionBase("get-check-visual-extension", - "Returns true, if plug-ins checks for visual extension.")); - res.Add(new AasxPluginActionDescriptionBase("fill-panel-visual-extension", - "When called, fill given WPF panel with control for graph display.")); - return res.ToArray(); - } - - public new AasxPluginResultBase ActivateAction(string action, params object[] args) - { - // for speed reasons, have the most often used at top! - if (action == "call-check-visual-extension") - { - // arguments - if (args.Length < 1) - return null; - - // looking only for Submodels - var sm = args[0] as Aas.Submodel; - if (sm == null) - return null; - - // check for a record in options, that matches Submodel - var found = false; - // ReSharper disable once UnusedVariable - foreach (var rec in _options.LookupAllIndexKey( - sm.SemanticId?.GetAsExactlyOneKey())) - found = true; - if (!found) - return null; - - // success prepare record - var cve = new AasxPluginResultVisualExtension("MTP", "Module Type Package - View"); - - // ok - return cve; - } - - // can basic helper help to reduce lines of code? - var help = ActivateActionBasicHelper(action, ref _options, args, - disableDefaultLicense: true, - enableGetCheckVisuExt: true); - if (help != null) - return help; - - // rest follows - - if (action == "get-licenses") - { - var lic = new AasxPluginResultLicense(); - lic.shortLicense = "The AutomationML.Engine is licensed under the MIT license (MIT) (see below)."; - - lic.isStandardLicense = true; - lic.longLicense = AasxPluginHelper.LoadLicenseTxtFromAssemblyDir( - "LICENSE.txt", Assembly.GetExecutingAssembly()); - - return lic; - } - - if (action == "fill-panel-visual-extension" && this._viewerControl != null) - { - // arguments - if (args?.Length < 3) - return null; - - // call - var resobj = AasxPluginMtpViewer.WpfMtpControlWrapper.FillWithWpfControls(args?[0], args?[1], - this._options, this._eventStack, this._log, args?[2]); - - // give object back - var res = new AasxPluginResultBaseObject(); - res.obj = resobj; - return res; - } - - // default - return null; - } - - } -} diff --git a/src/AasxPluginMtpViewer/Properties/AssemblyInfo.cs b/src/AasxPluginMtpViewer/Properties/AssemblyInfo.cs deleted file mode 100644 index e6987bb2d..000000000 --- a/src/AasxPluginMtpViewer/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System.Reflection; -using System.Resources; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Windows; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die einer Assembly zugeordnet sind. -[assembly: AssemblyTitle("AasxPluginMtpViewer")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("AasxPluginMtpViewer")] -[assembly: AssemblyCopyright("Copyright © 2020")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly -// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von -// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. -[assembly: ComVisible(false)] - -//Um mit dem Erstellen lokalisierbarer Anwendungen zu beginnen, legen Sie -//ImCodeVerwendeteKultur in der .csproj-Datei -//in einer fest. Wenn Sie in den Quelldateien beispielsweise Deutsch -//(Deutschland) verwenden, legen Sie auf \"de-DE\" fest. Heben Sie dann die Auskommentierung -//des nachstehenden NeutralResourceLanguage-Attributs auf. Aktualisieren Sie "en-US" in der nachstehenden Zeile, -//sodass es mit der UICulture-Einstellung in der Projektdatei übereinstimmt. - -//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] - - -[assembly: ThemeInfo( - ResourceDictionaryLocation.None, //Speicherort der designspezifischen Ressourcenwörterbücher - //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, - // oder in den Anwendungsressourcen-Wörterbüchern nicht gefunden werden kann.) - ResourceDictionaryLocation.SourceAssembly //Speicherort des generischen Ressourcenwörterbuchs - //(wird verwendet, wenn eine Ressource auf der Seite nicht gefunden wird, - // designspezifischen Ressourcenwörterbuch nicht gefunden werden kann.) -)] - - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, -// übernehmen, indem Sie "*" eingeben: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/AasxPluginMtpViewer/Properties/Resources.Designer.cs b/src/AasxPluginMtpViewer/Properties/Resources.Designer.cs deleted file mode 100644 index c9b1f962f..000000000 --- a/src/AasxPluginMtpViewer/Properties/Resources.Designer.cs +++ /dev/null @@ -1,62 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Dieser Code wurde von einem Tool generiert. -// Laufzeitversion: 4.0.30319.42000 -// -// Änderungen an dieser Datei können fehlerhaftes Verhalten verursachen und gehen verloren, wenn -// der Code neu generiert wird. -// -//------------------------------------------------------------------------------ - -namespace AasxPluginMtpViewer.Properties { - - - /// - /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. - /// - // Diese Klasse wurde von der StronglyTypedResourceBuilder-Klasse - // über ein Tool wie ResGen oder Visual Studio automatisch generiert. - // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen - // mit der Option /str erneut aus, oder erstellen Sie Ihr VS-Projekt neu. - [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() { - } - - /// - /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. - /// - [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("AasxPluginMtpViewer.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle - /// Ressourcenlookups, die diese stark typisierte Ressourcenklasse verwenden. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - } -} diff --git a/src/AasxPluginMtpViewer/Properties/Resources.resx b/src/AasxPluginMtpViewer/Properties/Resources.resx deleted file mode 100644 index af7dbebba..000000000 --- a/src/AasxPluginMtpViewer/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/src/AasxPluginMtpViewer/Properties/Settings.Designer.cs b/src/AasxPluginMtpViewer/Properties/Settings.Designer.cs deleted file mode 100644 index ef16259b6..000000000 --- a/src/AasxPluginMtpViewer/Properties/Settings.Designer.cs +++ /dev/null @@ -1,30 +0,0 @@ -//------------------------------------------------------------------------------ -// -// 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. -// -//------------------------------------------------------------------------------ - -namespace AasxPluginMtpViewer.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; - } - } - } -} diff --git a/src/AasxPluginMtpViewer/Properties/Settings.settings b/src/AasxPluginMtpViewer/Properties/Settings.settings deleted file mode 100644 index 033d7a5e9..000000000 --- a/src/AasxPluginMtpViewer/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/AasxPluginMtpViewer/Resources/LICENSE.TXT b/src/AasxPluginMtpViewer/Resources/LICENSE.TXT deleted file mode 100644 index fc70527e2..000000000 --- a/src/AasxPluginMtpViewer/Resources/LICENSE.TXT +++ /dev/null @@ -1,651 +0,0 @@ -Copyright (c) 2018-2023 Festo SE & Co. KG , author: Michael Hoffmeister -Copyright (c) 2019 PHOENIX CONTACT GmbH & Co. KG , author: Andreas Orzelski -This software is licensed under the Eclipse Public License 2.0 (EPL-2.0) (see below) -The browser functionality is licensed under the cefSharp license (see below) -The Newtonsoft.JSON serialization is licensed under the MIT License (MIT) (see below) -The QR code generation is licensed under the MIT license (MIT) (see below) -The Zxing.Net Dot Matrix Code (DMC) generation is licensed under the Apache License 2.0 (Apache-2.0) (see below) -The Grapevine REST server framework is licensed under Apache License 2.0 (Apache-2.0) (see below) -The AutomationML.Engine is licensed under the MIT license (MIT) (see below) -The MQTT server and client is licensed under the MIT license (MIT) (see below) - -This application is a sample application for demonstration of the features of the Administration Shell. -It is not allowed for productive use. The implementation uses the concepts of the document "Details of the Asset -Administration Shell" published on www.plattform-i40.de which is licensed under Creative Commons CC BY-ND 3.0 DE. - -Eclipse Public License 2.0 (EPL-2.0) -==================================== - -(https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt) - - THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE - PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION - OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. - -1. DEFINITIONS - -"Contribution" means: - - a) in the case of the initial Contributor, the initial content - Distributed under this Agreement, and - - b) in the case of each subsequent Contributor: - i) changes to the Program, and - ii) additions to the Program; - where such changes and/or additions to the Program originate from - and are Distributed by that particular Contributor. A Contribution - "originates" from a Contributor if it was added to the Program by - such Contributor itself or anyone acting on such Contributor's behalf. - Contributions do not include changes or additions to the Program that - are not Modified Works. - -"Contributor" means any person or entity that Distributes the Program. - -"Licensed Patents" mean patent claims licensable by a Contributor which -are necessarily infringed by the use or sale of its Contribution alone -or when combined with the Program. - -"Program" means the Contributions Distributed in accordance with this -Agreement. - -"Recipient" means anyone who receives the Program under this Agreement -or any Secondary License (as applicable), including Contributors. - -"Derivative Works" shall mean any work, whether in Source Code or other -form, that is based on (or derived from) the Program and for which the -editorial revisions, annotations, elaborations, or other modifications -represent, as a whole, an original work of authorship. - -"Modified Works" shall mean any work in Source Code or other form that -results from an addition to, deletion from, or modification of the -contents of the Program, including, for purposes of clarity any new file -in Source Code form that contains any contents of the Program. Modified -Works shall not include works that contain only declarations, -interfaces, types, classes, structures, or files of the Program solely -in each case in order to link to, bind by name, or subclass the Program -or Modified Works thereof. - -"Distribute" means the acts of a) distributing or b) making available -in any manner that enables the transfer of a copy. - -"Source Code" means the form of a Program preferred for making -modifications, including but not limited to software source code, -documentation source, and configuration files. - -"Secondary License" means either the GNU General Public License, -Version 2.0, or any later versions of that license, including any -exceptions or additional permissions as identified by the initial -Contributor. - -2. GRANT OF RIGHTS - - a) Subject to the terms of this Agreement, each Contributor hereby - grants Recipient a non-exclusive, worldwide, royalty-free copyright - license to reproduce, prepare Derivative Works of, publicly display, - publicly perform, Distribute and sublicense the Contribution of such - Contributor, if any, and such Derivative Works. - - b) Subject to the terms of this Agreement, each Contributor hereby - grants Recipient a non-exclusive, worldwide, royalty-free patent - license under Licensed Patents to make, use, sell, offer to sell, - import and otherwise transfer the Contribution of such Contributor, - if any, in Source Code or other form. This patent license shall - apply to the combination of the Contribution and the Program if, at - the time the Contribution is added by the Contributor, such addition - of the Contribution causes such combination to be covered by the - Licensed Patents. The patent license shall not apply to any other - combinations which include the Contribution. No hardware per se is - licensed hereunder. - - c) Recipient understands that although each Contributor grants the - licenses to its Contributions set forth herein, no assurances are - provided by any Contributor that the Program does not infringe the - patent or other intellectual property rights of any other entity. - Each Contributor disclaims any liability to Recipient for claims - brought by any other entity based on infringement of intellectual - property rights or otherwise. As a condition to exercising the - rights and licenses granted hereunder, each Recipient hereby - assumes sole responsibility to secure any other intellectual - property rights needed, if any. For example, if a third party - patent license is required to allow Recipient to Distribute the - Program, it is Recipient's responsibility to acquire that license - before distributing the Program. - - d) Each Contributor represents that to its knowledge it has - sufficient copyright rights in its Contribution, if any, to grant - the copyright license set forth in this Agreement. - - e) Notwithstanding the terms of any Secondary License, no - Contributor makes additional grants to any Recipient (other than - those set forth in this Agreement) as a result of such Recipient's - receipt of the Program under the terms of a Secondary License - (if permitted under the terms of Section 3). - -3. REQUIREMENTS - -3.1 If a Contributor Distributes the Program in any form, then: - - a) the Program must also be made available as Source Code, in - accordance with section 3.2, and the Contributor must accompany - the Program with a statement that the Source Code for the Program - is available under this Agreement, and informs Recipients how to - obtain it in a reasonable manner on or through a medium customarily - used for software exchange; and - - b) the Contributor may Distribute the Program under a license - different than this Agreement, provided that such license: - i) effectively disclaims on behalf of all other Contributors all - warranties and conditions, express and implied, including - warranties or conditions of title and non-infringement, and - implied warranties or conditions of merchantability and fitness - for a particular purpose; - - ii) effectively excludes on behalf of all other Contributors all - liability for damages, including direct, indirect, special, - incidental and consequential damages, such as lost profits; - - iii) does not attempt to limit or alter the recipients' rights - in the Source Code under section 3.2; and - - iv) requires any subsequent distribution of the Program by any - party to be under a license that satisfies the requirements - of this section 3. - -3.2 When the Program is Distributed as Source Code: - - a) it must be made available under this Agreement, or if the - Program (i) is combined with other material in a separate file or - files made available under a Secondary License, and (ii) the initial - Contributor attached to the Source Code the notice described in - Exhibit A of this Agreement, then the Program may be made available - under the terms of such Secondary Licenses, and - - b) a copy of this Agreement must be included with each copy of - the Program. - -3.3 Contributors may not remove or alter any copyright, patent, -trademark, attribution notices, disclaimers of warranty, or limitations -of liability ("notices") contained within the Program from any copy of -the Program which they Distribute, provided that Contributors may add -their own appropriate notices. - -4. COMMERCIAL DISTRIBUTION - -Commercial distributors of software may accept certain responsibilities -with respect to end users, business partners and the like. While this -license is intended to facilitate the commercial use of the Program, -the Contributor who includes the Program in a commercial product -offering should do so in a manner which does not create potential -liability for other Contributors. Therefore, if a Contributor includes -the Program in a commercial product offering, such Contributor -("Commercial Contributor") hereby agrees to defend and indemnify every -other Contributor ("Indemnified Contributor") against any losses, -damages and costs (collectively "Losses") arising from claims, lawsuits -and other legal actions brought by a third party against the Indemnified -Contributor to the extent caused by the acts or omissions of such -Commercial Contributor in connection with its distribution of the Program -in a commercial product offering. The obligations in this section do not -apply to any claims or Losses relating to any actual or alleged -intellectual property infringement. In order to qualify, an Indemnified -Contributor must: a) promptly notify the Commercial Contributor in -writing of such claim, and b) allow the Commercial Contributor to control, -and cooperate with the Commercial Contributor in, the defense and any -related settlement negotiations. The Indemnified Contributor may -participate in any such claim at its own expense. - -For example, a Contributor might include the Program in a commercial -product offering, Product X. That Contributor is then a Commercial -Contributor. If that Commercial Contributor then makes performance -claims, or offers warranties related to Product X, those performance -claims and warranties are such Commercial Contributor's responsibility -alone. Under this section, the Commercial Contributor would have to -defend claims against the other Contributors related to those performance -claims and warranties, and if a court requires any other Contributor to -pay any damages as a result, the Commercial Contributor must pay -those damages. - -5. NO WARRANTY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT -PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" -BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR -IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF -TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR -PURPOSE. Each Recipient is solely responsible for determining the -appropriateness of using and distributing the Program and assumes all -risks associated with its exercise of rights under this Agreement, -including but not limited to the risks and costs of program errors, -compliance with applicable laws, damage to or loss of data, programs -or equipment, and unavailability or interruption of operations. - -6. DISCLAIMER OF LIABILITY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT -PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS -SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST -PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE -EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - -7. GENERAL - -If any provision of this Agreement is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of -the remainder of the terms of this Agreement, and without further -action by the parties hereto, such provision shall be reformed to the -minimum extent necessary to make such provision valid and enforceable. - -If Recipient institutes patent litigation against any entity -(including a cross-claim or counterclaim in a lawsuit) alleging that the -Program itself (excluding combinations of the Program with other software -or hardware) infringes such Recipient's patent(s), then such Recipient's -rights granted under Section 2(b) shall terminate as of the date such -litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it -fails to comply with any of the material terms or conditions of this -Agreement and does not cure such failure in a reasonable period of -time after becoming aware of such noncompliance. If all Recipient's -rights under this Agreement terminate, Recipient agrees to cease use -and distribution of the Program as soon as reasonably practicable. -However, Recipient's obligations under this Agreement and any licenses -granted by Recipient relating to the Program shall continue and survive. - -Everyone is permitted to copy and distribute copies of this Agreement, -but in order to avoid inconsistency the Agreement is copyrighted and -may only be modified in the following manner. The Agreement Steward -reserves the right to publish new versions (including revisions) of -this Agreement from time to time. No one other than the Agreement -Steward has the right to modify this Agreement. The Eclipse Foundation -is the initial Agreement Steward. The Eclipse Foundation may assign the -responsibility to serve as the Agreement Steward to a suitable separate -entity. Each new version of the Agreement will be given a distinguishing -version number. The Program (including Contributions) may always be -Distributed subject to the version of the Agreement under which it was -received. In addition, after a new version of the Agreement is published, -Contributor may elect to Distribute the Program (including its -Contributions) under the new version. - -Except as expressly stated in Sections 2(a) and 2(b) above, Recipient -receives no rights or licenses to the intellectual property of any -Contributor under this Agreement, whether expressly, by implication, -estoppel or otherwise. All rights in the Program not expressly granted -under this Agreement are reserved. Nothing in this Agreement is intended -to be enforceable by any entity that is not a Contributor or Recipient. -No third-party beneficiary rights are created under this Agreement. - -Exhibit A - Form of Secondary Licenses Notice - -"This Source Code may also be made available under the following -Secondary Licenses when the conditions for such availability set forth -in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), -version(s), and exceptions or additional permissions here}." - - Simply including a copy of this Agreement, including this Exhibit A - is not sufficient to license the Source Code under Secondary Licenses. - - If it is not possible or desirable to put the notice in a particular - file, then You may include the notice in a location (such as a LICENSE - file in a relevant directory) where a recipient would be likely to - look for such a notice. - - You may add additional accurate notices of copyright ownership. - -With respect to cefSharp -======================== - -(https://raw.githubusercontent.com/cefsharp/CefSharp/master/LICENSE) - -// Copyright © The CefSharp Authors. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// * Neither the name of Google Inc. nor the name Chromium Embedded -// Framework nor the name CefSharp nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -With respect to Newtonsoft.Json -=============================== - -(https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md) - -The MIT License (MIT) - -Copyright (c) 2007 James Newton-King - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to QRcoder -======================= - -(https://github.com/codebude/QRCoder/blob/master/LICENSE.txt) - -The MIT License (MIT) - -Copyright (c) 2013-2018 Raffael Herrmann - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to ZXing.Net -========================= -With respect to Grapevine -========================= - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to AutomationML.Engine -=================================== - -(https://raw.githubusercontent.com/AutomationML/AMLEngine2.1/master/license.txt) - -The MIT License (MIT) - -Copyright 2017 AutomationML e.V. - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to MQTTnet -======================= - -(https://github.com/chkr1011/MQTTnet/blob/master/LICENSE) - -MIT License - -MQTTnet Copyright (c) 2016-2019 Christian Kratky - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -With respect to MSAGL (Microsoft Automatic Graph Layout) -======================================================== -(see: https://github.com/microsoft/automatic-graph-layout/blob/master/LICENSE) - -Microsoft Automatic Graph Layout, MSAGL - -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -""Software""), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/src/AasxPluginMtpViewer/WpfMtpControlWrapper.xaml b/src/AasxPluginMtpViewer/WpfMtpControlWrapper.xaml deleted file mode 100644 index 413575130..000000000 --- a/src/AasxPluginMtpViewer/WpfMtpControlWrapper.xaml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (c) 2019 by Michael Hoffmeister, Festo AG & Co. KG - - - diff --git a/src/AasxPluginMtpViewer/WpfMtpControlWrapper.xaml.cs b/src/AasxPluginMtpViewer/WpfMtpControlWrapper.xaml.cs deleted file mode 100644 index 2e2d3592e..000000000 --- a/src/AasxPluginMtpViewer/WpfMtpControlWrapper.xaml.cs +++ /dev/null @@ -1,505 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using AasxIntegrationBase; -using AasxPredefinedConcepts; -using Aas = AasCore.Aas3_0; -using AdminShellNS; -using Extensions; -using Newtonsoft.Json; -using WpfMtpControl; -using WpfMtpControl.DataSources; - -namespace AasxPluginMtpViewer -{ - public partial class WpfMtpControlWrapper : UserControl - { - // internal members - - private LogInstance theLog = null; - private AdminShellPackageEnv thePackage = null; - private Aas.Submodel theSubmodel = null; - private AasxPluginMtpViewer.MtpViewerOptions theOptions = null; - private PluginEventStack theEventStack = null; - - private AasxPredefinedConcepts.DefinitionsExperimental.InteropRelations defsInterop = null; - private DefinitionsMTP.ModuleTypePackage defsMtp = null; - - public MtpDataSourceOpcUaPreLoadInfo thePreLoadInfo = new MtpDataSourceOpcUaPreLoadInfo(); - - private WpfMtpControl.MtpSymbolLib theSymbolLib = null; - private WpfMtpControl.MtpVisualObjectLib activeVisualObjectLib = null; - private WpfMtpControl.MtpData activeMtpData = null; - - private Aas.File activeMtpFileElem = null; - private string activeMtpFileFn = null; - - public WpfMtpControl.MtpVisuOpcUaClient client = new WpfMtpControl.MtpVisuOpcUaClient(); - - private MtpDataSourceSubscriber activeSubscriber = null; - - private MtpSymbolMapRecordList hintsForConfigRecs = null; - - // window / plugin mechanics - - public WpfMtpControlWrapper() - { - InitializeComponent(); - - // use pre-definitions - this.defsInterop = new AasxPredefinedConcepts.DefinitionsExperimental.InteropRelations(); - this.defsMtp = new DefinitionsMTP.ModuleTypePackage(); - } - - public void Start( - AdminShellPackageEnv thePackage, - Aas.Submodel theSubmodel, - AasxPluginMtpViewer.MtpViewerOptions theOptions, - PluginEventStack eventStack, - LogInstance log) - { - this.thePackage = thePackage; - this.theSubmodel = theSubmodel; - this.theOptions = theOptions; - this.theEventStack = eventStack; - this.theLog = log; - } - - public static WpfMtpControlWrapper FillWithWpfControls( - object opackage, object osm, - AasxPluginMtpViewer.MtpViewerOptions options, - PluginEventStack eventStack, - LogInstance log, - object masterDockPanel) - { - // access - var package = opackage as AdminShellPackageEnv; - var sm = osm as Aas.Submodel; - var master = masterDockPanel as DockPanel; - if (package == null || sm == null || master == null) - return null; - - // the Submodel elements need to have parents - sm.SetAllParents(); - - // create TOP control - var wrapperCntl = new WpfMtpControlWrapper(); - wrapperCntl.Start(package, sm, options, eventStack, log); - master.Children.Add(wrapperCntl); - - // return shelf - return wrapperCntl; - } - - private void UserControl_Loaded(object sender, RoutedEventArgs e) - { - // initialize symbol library - this.theSymbolLib = new MtpSymbolLib(); - - var ISO10628 = new ResourceDictionary(); - ISO10628.Source = new Uri( - "pack://application:,,,/WpfMtpControl;component/Resources/PNID_DIN_EN_ISO_10628.xaml"); - this.theSymbolLib.ImportResourceDicrectory("PNID_ISO10628", ISO10628); - - var FESTO = new ResourceDictionary(); - FESTO.Source = new Uri( - "pack://application:,,,/WpfMtpControl;component/Resources/PNID_Festo.xaml"); - this.theSymbolLib.ImportResourceDicrectory("PNID_Festo", FESTO); - - // initialize visual object libraries - activeVisualObjectLib = new WpfMtpControl.MtpVisualObjectLib(); - activeVisualObjectLib.LoadStatic(this.theSymbolLib); - - // gather infos - var ok = GatherMtpInfos(this.thePreLoadInfo); - if (ok && this.activeMtpFileFn != null) - { - // access file - var inputFn = this.activeMtpFileFn; - if (CheckIfPackageFile(inputFn)) - inputFn = thePackage.MakePackageFileAvailableAsTempFile(inputFn); - - // load file - LoadFile(inputFn); - - // fit it - this.mtpVisu.ZoomToFitCanvas(); - - // double click handler - this.mtpVisu.MtpObjectDoubleClick += MtpVisu_MtpObjectDoubleClick; - } - - // Timer for status - System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer(); - // ReSharper disable once RedundantDelegateCreation - dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick); - dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 100); - dispatcherTimer.Start(); - } - - private void dispatcherTimer_Tick(object sender, EventArgs e) - { - if (this.client == null) - textBoxDataSourceStatus.Text = "(no OPC UA client enabled)"; - else - { - this.client.Tick(100); - textBoxDataSourceStatus.Text = this.client.GetStatus(); - } - } - - // handle Submodel data - - private bool GatherMtpInfos(MtpDataSourceOpcUaPreLoadInfo preLoadInfo) - { - // access - var env = this.thePackage?.AasEnv; - if (this.theSubmodel?.SemanticId == null || this.theSubmodel.SubmodelElements == null - || this.defsMtp == null - || env?.AssetAdministrationShells == null - || this.thePackage.AasEnv.Submodels == null) - return false; - - // need to find the type Submodel - Aas.ISubmodel mtpTypeSm = null; - - // check, if the user pointed to the instance submodel - if (this.theSubmodel.SemanticId.Matches(this.defsMtp.SEM_MtpInstanceSubmodel)) - { - // Source list - foreach (var srcLst in this.theSubmodel.SubmodelElements - .FindAllSemanticIdAs( - this.defsMtp.CD_SourceList?.GetReference(), MatchMode.Relaxed)) - { - // found a source list, might contain sources - if (srcLst?.Value == null) - continue; - - // UA Server? - foreach (var src in srcLst.Value.FindAllSemanticIdAs( - this.defsMtp.CD_SourceOpcUaServer?.GetReference(), MatchMode.Relaxed)) - if (src?.Value != null) - { - // UA server - var ep = src.Value.FindFirstSemanticIdAs( - this.defsMtp.CD_Endpoint.GetReference(), MatchMode.Relaxed)?.Value; - - // add - if (preLoadInfo?.EndpointMapping != null) - preLoadInfo.EndpointMapping.Add( - new MtpDataSourceOpcUaEndpointMapping( - "" + ep, ForName: ("" + src.IdShort).Trim())); - } - } - - // Identifier renaming? - foreach (var ren in theSubmodel.SubmodelElements - .FindAllSemanticIdAs( - this.defsMtp.CD_IdentifierRenaming?.GetReference(), MatchMode.Relaxed)) - if (ren?.Value != null) - { - var oldtxt = ren.Value.FindFirstSemanticIdAs( - this.defsMtp.CD_RenamingOldText?.GetReference(), MatchMode.Relaxed)?.Value; - var newtxt = ren.Value.FindFirstSemanticIdAs( - this.defsMtp.CD_RenamingNewText?.GetReference(), MatchMode.Relaxed)?.Value; - if (oldtxt.HasContent() && newtxt.HasContent() && - preLoadInfo?.IdentifierRenaming != null) - preLoadInfo.IdentifierRenaming.Add(new MtpDataSourceStringReplacement(oldtxt, newtxt)); - } - - // Namespace renaming? - foreach (var ren in theSubmodel.SubmodelElements - .FindAllSemanticIdAs( - this.defsMtp.CD_NamespaceRenaming?.GetReference(), MatchMode.Relaxed)) - if (ren?.Value != null) - { - var oldtxt = ren?.Value.FindFirstSemanticIdAs( - this.defsMtp.CD_RenamingOldText?.GetReference(), MatchMode.Relaxed)?.Value; - var newtxt = ren?.Value.FindFirstSemanticIdAs( - this.defsMtp.CD_RenamingNewText?.GetReference(), MatchMode.Relaxed)?.Value; - if (oldtxt.HasContent() && newtxt.HasContent() && - preLoadInfo?.NamespaceRenaming != null) - preLoadInfo.NamespaceRenaming.Add(new MtpDataSourceStringReplacement(oldtxt, newtxt)); - } - - // according spec from Sten Gruener, the derivedFrom relationship shall be exploited. - // How to get from subModel to AAS? - var instanceAas = env.FindAasWithSubmodelId(this.theSubmodel.Id); - var typeAas = env.FindReferableByReference(instanceAas?.DerivedFrom) as Aas.AssetAdministrationShell; - if (instanceAas?.DerivedFrom != null && typeAas != null) - foreach (var msm in env.FindAllSubmodelGroupedByAAS((aas, sm) => - { - return aas == typeAas && true == sm?.SemanticId?.Matches(this.defsMtp.SEM_MtpSubmodel); - })) - { - mtpTypeSm = msm; - break; - } - - // another possibility: direct reference - var dirLink = this.theSubmodel.SubmodelElements - .FindFirstSemanticIdAs( - this.defsMtp.CD_MtpTypeSubmodel?.GetReference(), MatchMode.Relaxed); - var dirLinkSm = env.FindReferableByReference(dirLink?.Value) as Aas.Submodel; - if (mtpTypeSm == null) - mtpTypeSm = dirLinkSm; - - } - - // other (not intended) case: user points to type submodel directly - if (mtpTypeSm == null - && this.theSubmodel.SemanticId.Matches(this.defsMtp.SEM_MtpSubmodel)) - mtpTypeSm = this.theSubmodel; - - // ok, is there a type submodel? - if (mtpTypeSm == null) - return false; - - // find file, remember Submodel element for it, find filename - // (ConceptDescription)(no-local)[IRI]http://www.admin-shell.io/mtp/v1/MTPSUCLib/ModuleTypePackage - this.activeMtpFileElem = mtpTypeSm.SubmodelElements? - .FindFirstSemanticIdAs(this.defsMtp.CD_MtpFile.GetReference(), - MatchMode.Relaxed); - var inputFn = this.activeMtpFileElem?.Value; - if (inputFn == null) - return false; - this.activeMtpFileFn = inputFn; - - return true; - } - - // MTP handlings - - private bool CheckIfPackageFile(string fn) - { - return fn.StartsWith(@"/"); - } - - private void LoadFile(string fn) - { - if (!".aml .zip .mtp".Contains(System.IO.Path.GetExtension(fn.Trim().ToLower()))) - return; - - this.client = new WpfMtpControl.MtpVisuOpcUaClient(); - this.client.ItemChanged += Client_ItemChanged; - this.activeSubscriber = new MtpDataSourceSubscriber(); - this.hintsForConfigRecs = new MtpSymbolMapRecordList(); - - this.activeMtpData = new WpfMtpControl.MtpData(); - this.activeMtpData.LoadAmlOrMtp(activeVisualObjectLib, - this.client, this.thePreLoadInfo, this.activeSubscriber, fn); - - if (this.activeMtpData.PictureCollection.Count > 0) - mtpVisu.SetPicture(this.activeMtpData.PictureCollection.Values.ElementAt(0)); - mtpVisu.RedrawMtp(); - } - - private void Client_ItemChanged(WpfMtpControl.DataSources.IMtpDataSourceStatus dataSource, - MtpVisuOpcUaClient.DetailItem itemRef, MtpVisuOpcUaClient.ItemChangeType changeType) - { - if (dataSource == null || itemRef == null || itemRef.MtpSourceItemId == null - || this.activeSubscriber == null) - return; - - if (changeType == MtpVisuOpcUaClient.ItemChangeType.Value) - this.activeSubscriber.Invoke(itemRef.MtpSourceItemId, MtpDataSourceSubscriber.ChangeType.Value, - itemRef.Value); - } - - private void MtpVisu_MtpObjectDoubleClick(MtpData.MtpBaseObject source) - { - // access - var sme = this.theSubmodel?.SubmodelElements; - var first = this.activeMtpFileElem.GetReference(); - if (source == null || this.activeMtpFileElem == null || sme == null || first == null) - return; - - // for the active file, find a Reference for it - - foreach (var searchId in new[] { source.Name, source.RefID }) - { - // access - if (searchId == null) - continue; - // - // Search for FileToNavigateElement - // - - var firstFtn = first.Add(new Aas.Key(Aas.KeyTypes.GlobalReference, searchId)); - this.theLog?.Info($"DblClick MTP .. search reference: {firstFtn.ToStringExtended(1)}"); - - foreach (var fileToNav in sme.FindAllSemanticIdAs( - this.defsInterop?.CD_FileToNavigateElement?.GetReference(), MatchMode.Relaxed)) - if (fileToNav.First?.Matches(firstFtn, MatchMode.Relaxed) == true) - { - // try activate - var ev = new AasxIntegrationBase.AasxPluginResultEventNavigateToReference(); - ev.targetReference = fileToNav.Second.Copy(); - this.theEventStack?.PushEvent(ev); - return; - } - - // - // Search for FileToEntity - // - - var firstFte = first.Add(new Aas.Key(Aas.KeyTypes.GlobalReference, searchId)); - this.theLog?.Info($"DblClick MTP .. search reference: {firstFte.ToStringExtended(1)}"); - - foreach (var fileToEnt in sme.FindAllSemanticIdAs( - this.defsInterop?.CD_FileToEntity?.GetReference(), MatchMode.Relaxed)) - if (fileToEnt.First?.Matches(firstFte, MatchMode.Relaxed) == true) - { - // debug - this.theLog?.Info($"try find Entity {"" + fileToEnt.Second} .."); - - // find Entity, check if self-contained - var foundRef = this.thePackage?.AasEnv?.FindReferableByReference(fileToEnt.Second); - if (foundRef is Aas.Entity foundEnt - && foundEnt.EntityType == Aas.EntityType.SelfManagedEntity - && foundEnt.GlobalAssetId != null) - { - // try activate - var ev = new AasxIntegrationBase.AasxPluginResultEventNavigateToReference(); - ev.targetReference = new Aas.Reference(Aas.ReferenceTypes.ExternalReference, - new Aas.IKey[] { new Aas.Key(Aas.KeyTypes.GlobalReference, foundEnt.GlobalAssetId) } - .ToList()); - this.theEventStack?.PushEvent(ev); - return; - } - } - } - } - - // visual window handling - - private int overlayPanelMode = 0; - - private void SetOverlayPanelMode(int newMode) - { - this.overlayPanelMode = newMode; - - switch (this.overlayPanelMode) - { - case 2: - this.ScrollViewerDataSources.Visibility = Visibility.Visible; - DataGridDataSources.ItemsSource = this.client.Items; - this.RichTextReport.Visibility = Visibility.Collapsed; - break; - - case 1: - this.ScrollViewerDataSources.Visibility = Visibility.Collapsed; - DataGridDataSources.ItemsSource = null; - this.RichTextReport.Visibility = Visibility.Visible; - ReportOnConfiguration(this.RichTextReport); - break; - - default: - this.ScrollViewerDataSources.Visibility = Visibility.Collapsed; - DataGridDataSources.ItemsSource = null; - this.RichTextReport.Visibility = Visibility.Collapsed; - break; - } - } - - private void Button_Click(object sender, RoutedEventArgs e) - { - if (sender == buttonDataSourceDetails) - { - if (this.overlayPanelMode != 2) - SetOverlayPanelMode(2); - else - SetOverlayPanelMode(0); - } - - if (sender == buttonConfig) - { - if (this.overlayPanelMode != 1) - SetOverlayPanelMode(1); - else - SetOverlayPanelMode(0); - } - } - - private void AddToRichTextBox(RichTextBox rtb, string text, bool bold = false, double? fontSize = null, - bool monoSpaced = false) - { - var p = new Paragraph(); - if (bold) - p.FontWeight = FontWeights.Bold; - if (fontSize.HasValue) - p.FontSize = fontSize.Value; - if (monoSpaced) - p.FontFamily = new System.Windows.Media.FontFamily("Courier New"); - p.Inlines.Add(new Run(text)); - rtb.Document.Blocks.Add(p); - } - - private void ReportOnConfiguration(RichTextBox rtb) - { - // access - if (rtb == null) - return; - - rtb.Document.Blocks.Clear(); - - // - // Report on available library symbols - // - - if (this.theSymbolLib != null) - { - - AddToRichTextBox(rtb, "Library symbols", bold: true, fontSize: 18); - - AddToRichTextBox(rtb, "The following lists shows available symbol full names."); - - foreach (var x in this.theSymbolLib.Values) - { - AddToRichTextBox(rtb, "" + x.FullName, monoSpaced: true); - } - - AddToRichTextBox(rtb, ""); - } - - // - // Hints for configurations - // - - if (this.hintsForConfigRecs != null) - { - AddToRichTextBox(rtb, "Preformatted configuration records", bold: true, fontSize: 18); - AddToRichTextBox(rtb, - "The following JSON elements could be pasted into the options file named " + "" + - "'AasxPluginMtpViewer.options.json'. " + - "Prior to pasting, an appropriate symbol full name needs to be chosen from above list. " + - "For the eClass strings, multiples choices can be delimited by ';'. " + - "For EClassVersions, 'null' disables version checking. " + - "Either EClassClasses or EClassIRDIs shall be different to 'null'."); - - foreach (var x in this.hintsForConfigRecs) - { - var txt = JsonConvert.SerializeObject(x, Formatting.None); - AddToRichTextBox(rtb, "" + txt, monoSpaced: true); - } - - AddToRichTextBox(rtb, ""); - } - } - } -} From 1a12f9a60613a7dbb2d95d066288f33a05b39b9b Mon Sep 17 00:00:00 2001 From: Alexander Wollbrink Date: Sun, 11 Aug 2024 12:53:23 +0200 Subject: [PATCH 12/13] removed OPC UA from Server menu --- src/AasxPackageLogic/ExplorerMenuFactory.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AasxPackageLogic/ExplorerMenuFactory.cs b/src/AasxPackageLogic/ExplorerMenuFactory.cs index 9cde2ad03..cb2b2123c 100644 --- a/src/AasxPackageLogic/ExplorerMenuFactory.cs +++ b/src/AasxPackageLogic/ExplorerMenuFactory.cs @@ -233,7 +233,7 @@ public static AasxMenu CreateMainMenu() .AddWpf(name: "MQTTPub", header: "Publish AAS via MQTT ") .AddSeparator() .AddWpf(name: "ServerPluginEmptySample", header: "Plugin: Empty Sample ") - .AddWpf(name: "ServerPluginOPCUA", header: "Plugin: OPC UA ") + //.AddWpf(name: "ServerPluginOPCUA", header: "Plugin: OPC UA ") .AddWpf(name: "ServerPluginMQTT", header: "Plugin: MQTT ")) .AddSeparator(filter: AasxMenuFilter.NotBlazor) .AddMenu(header: "System ", filter: AasxMenuFilter.NotBlazor, From 0a420c4482664c97c691f06ef7fa147258322352 Mon Sep 17 00:00:00 2001 From: Alexander Wollbrink Date: Sun, 11 Aug 2024 12:58:04 +0200 Subject: [PATCH 13/13] removing OPC UA Client entries from menu --- src/AasxPackageLogic/ExplorerMenuFactory.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/AasxPackageLogic/ExplorerMenuFactory.cs b/src/AasxPackageLogic/ExplorerMenuFactory.cs index cb2b2123c..62b5dc072 100644 --- a/src/AasxPackageLogic/ExplorerMenuFactory.cs +++ b/src/AasxPackageLogic/ExplorerMenuFactory.cs @@ -99,7 +99,7 @@ public static AasxMenu CreateMainMenu() .AddSeparator() .AddMenu(header: "Further connect options ", childs: (new AasxMenu()) .AddWpfBlazor(name: "ConnectSecure", header: "Secure Connect ", inputGesture: "Ctrl+Shift+S") - .AddWpfBlazor(name: "ConnectOpcUa", header: "Connect via OPC-UA ") + //.AddWpfBlazor(name: "ConnectOpcUa", header: "Connect via OPC-UA ") .AddWpfBlazor(name: "ConnectRest", header: "Connect via REST ", inputGesture: "F6")) .AddSeparator() .AddMenu(header: "AASX File Repository ", childs: (new AasxMenu()) @@ -158,8 +158,8 @@ public static AasxMenu CreateMainMenu() help: "Import OPC UA nodeset.xml into an existing Submodel.", args: new AasxMenuListOfArgDefs() .Add("File", "OPC UA Nodeset file.")) - .AddWpfBlazor(name: "OPCRead", header: "Read OPC values into SubModel ", - help: "Use Qualifiers attributed in a Submodel to read actual OPC UA values.") + /*.AddWpfBlazor(name: "OPCRead", header: "Read OPC values into SubModel ", + help: "Use Qualifiers attributed in a Submodel to read actual OPC UA values.")*/ .AddWpfBlazor(name: "RDFRead", header: "Import BAMM RDF into AASX ", help: "Import BAMM RDF into AASX.", args: new AasxMenuListOfArgDefs() @@ -195,13 +195,13 @@ public static AasxMenu CreateMainMenu() args: new AasxMenuListOfArgDefs() .Add("File", "OPC UA Nodeset2.xml file to write.") .Add("Location", "Location selection", hidden: true)) - .AddWpfBlazor(name: "OpcUaExportNodeSetUaPlugin", + /*.AddWpfBlazor(name: "OpcUaExportNodeSetUaPlugin", header: "Export OPC UA Nodeset2.xml (via UA server plug-in) ", help: "Export OPC UA Nodeset2.xml format by starting OPC UA server in plugin and " + "execute a post-process command.", args: new AasxMenuListOfArgDefs() .Add("File", "OPC UA Nodeset2.xml file to write.") - .Add("Location", "Location selection", hidden: true)) + .Add("Location", "Location selection", hidden: true))*/ .AddWpfBlazor(name: "CopyClipboardElementJson", header: "Copy selected element JSON to clipboard", inputGesture: "Shift+Ctrl+C") .AddWpfBlazor(name: "ExportGenericForms",