From 53f2a0666bee70d5e0ece8f81caef18d1c48fc2f Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Mon, 30 Sep 2019 16:18:53 +0200 Subject: [PATCH] 190930 --- Pilz.Collections/Pilz.Collections.vbproj | 2 +- .../SimpleHistory/ObjectValueType.vb | 12 + .../SimpleHistory/SimpleHistory.vb | 6 - Pilz.Configuration/Pilz.Configuration.vbproj | 2 +- Pilz.Configuration/packages.config | 2 +- ...ilz.Drawing.Drawing3D.OpenGLFactory.vbproj | 8 +- .../Preview/ModelPreview.vb | 80 +-- .../packages.config | 4 +- Pilz.Drawing/HelpfulDrawingFunctions.vb | 19 +- Pilz.Networking/ConnectionManagerBase.vb | 84 +++ .../My Project/Application.Designer.vb | 13 + Pilz.Networking/My Project/Application.myapp | 10 + Pilz.Networking/My Project/AssemblyInfo.vb | 35 + .../My Project/Resources.Designer.vb | 62 ++ Pilz.Networking/My Project/Resources.resx | 117 ++++ .../My Project/Settings.Designer.vb | 73 ++ Pilz.Networking/My Project/Settings.settings | 7 + Pilz.Networking/NetworkFeatures.vb | 54 ++ Pilz.Networking/Pilz.Networking.vbproj | 114 ++++ Pilz.Networking/TCPManager.vb | 83 +++ Pilz.Networking/UDPManager.vb | 94 +++ Pilz.Networking/packages.config | 5 + Pilz.Simple3DFileParser/Model/Mesh.vb | 43 +- Pilz.Simple3DFileParser/Model/Object3D.vb | 23 +- Pilz.Simple3DFileParser/Other/LoaderModule.vb | 5 +- .../Pilz.Simple3DFileParser.vbproj | 5 +- .../PaintingControl/DefaultDrawMethodes.vb | 16 +- Pilz.UI/PaintingControl/PaintingControl.vb | 128 ++-- Pilz.UI/PaintingControl/PaintingObject.vb | 2 +- .../PaintingControl/PaintingObjectResizing.vb | 5 +- Pilz.UI/Pilz.UI.vbproj | 2 +- Pilz.UI/packages.config | 2 +- Pilz.Updating.Updater/App.config | 6 + .../My Project/Application.Designer.vb | 38 ++ .../My Project/Application.myapp | 11 + .../My Project/AssemblyInfo.vb | 35 + .../My Project/Resources.Designer.vb | 63 ++ .../My Project/Resources.resx | 117 ++++ .../My Project/Settings.Designer.vb | 73 ++ .../My Project/Settings.settings | 7 + .../Pilz.Updating.UpdateInstaller.vbproj | 136 ++++ .../UpdateInstaller.Designer.vb | 65 ++ Pilz.Updating.Updater/UpdateInstaller.resx | 643 ++++++++++++++++++ Pilz.Updating.Updater/UpdateInstaller.vb | 115 ++++ Pilz.Updating.Updater/packages.config | 4 + Pilz.Updating/General.vb | 21 + Pilz.Updating/Model/BuildState.vb | 10 + Pilz.Updating/Model/CodeLanguage.vb | 8 + Pilz.Updating/Model/UpdateInfo.vb | 13 + Pilz.Updating/Model/UpdatePackage.vb | 12 + .../My Project/Application.Designer.vb | 13 + Pilz.Updating/My Project/Application.myapp | 10 + Pilz.Updating/My Project/AssemblyInfo.vb | 35 + .../My Project/Resources.Designer.vb | 62 ++ Pilz.Updating/My Project/Resources.resx | 117 ++++ Pilz.Updating/My Project/Settings.Designer.vb | 73 ++ Pilz.Updating/My Project/Settings.settings | 7 + .../MyEventArgs/UpdatesFoundEventArgs.vb | 17 + Pilz.Updating/Pilz.Updating.vbproj | 119 ++++ Pilz.Updating/Scripts/Script.vb | 13 + Pilz.Updating/Scripts/ScriptManager.vb | 71 ++ Pilz.Updating/Scripts/ScriptPriority.vb | 8 + Pilz.Updating/UpdateManager | 3 + Pilz.Updating/Updater.vb | 86 +++ Pilz.Updating/packages.config | 4 + Pilz.sln | 30 + Pilz/HelpfulFunctions.vb | 17 + Pilz/Pilz.vbproj | 2 + Shared Libs/AssimpNet.dll | Bin 0 -> 174080 bytes Shared Libs/ColladaSchema.dll | Bin 0 -> 109568 bytes 70 files changed, 2984 insertions(+), 197 deletions(-) create mode 100644 Pilz.Collections/SimpleHistory/ObjectValueType.vb create mode 100644 Pilz.Networking/ConnectionManagerBase.vb create mode 100644 Pilz.Networking/My Project/Application.Designer.vb create mode 100644 Pilz.Networking/My Project/Application.myapp create mode 100644 Pilz.Networking/My Project/AssemblyInfo.vb create mode 100644 Pilz.Networking/My Project/Resources.Designer.vb create mode 100644 Pilz.Networking/My Project/Resources.resx create mode 100644 Pilz.Networking/My Project/Settings.Designer.vb create mode 100644 Pilz.Networking/My Project/Settings.settings create mode 100644 Pilz.Networking/NetworkFeatures.vb create mode 100644 Pilz.Networking/Pilz.Networking.vbproj create mode 100644 Pilz.Networking/TCPManager.vb create mode 100644 Pilz.Networking/UDPManager.vb create mode 100644 Pilz.Networking/packages.config create mode 100644 Pilz.Updating.Updater/App.config create mode 100644 Pilz.Updating.Updater/My Project/Application.Designer.vb create mode 100644 Pilz.Updating.Updater/My Project/Application.myapp create mode 100644 Pilz.Updating.Updater/My Project/AssemblyInfo.vb create mode 100644 Pilz.Updating.Updater/My Project/Resources.Designer.vb create mode 100644 Pilz.Updating.Updater/My Project/Resources.resx create mode 100644 Pilz.Updating.Updater/My Project/Settings.Designer.vb create mode 100644 Pilz.Updating.Updater/My Project/Settings.settings create mode 100644 Pilz.Updating.Updater/Pilz.Updating.UpdateInstaller.vbproj create mode 100644 Pilz.Updating.Updater/UpdateInstaller.Designer.vb create mode 100644 Pilz.Updating.Updater/UpdateInstaller.resx create mode 100644 Pilz.Updating.Updater/UpdateInstaller.vb create mode 100644 Pilz.Updating.Updater/packages.config create mode 100644 Pilz.Updating/General.vb create mode 100644 Pilz.Updating/Model/BuildState.vb create mode 100644 Pilz.Updating/Model/CodeLanguage.vb create mode 100644 Pilz.Updating/Model/UpdateInfo.vb create mode 100644 Pilz.Updating/Model/UpdatePackage.vb create mode 100644 Pilz.Updating/My Project/Application.Designer.vb create mode 100644 Pilz.Updating/My Project/Application.myapp create mode 100644 Pilz.Updating/My Project/AssemblyInfo.vb create mode 100644 Pilz.Updating/My Project/Resources.Designer.vb create mode 100644 Pilz.Updating/My Project/Resources.resx create mode 100644 Pilz.Updating/My Project/Settings.Designer.vb create mode 100644 Pilz.Updating/My Project/Settings.settings create mode 100644 Pilz.Updating/MyEventArgs/UpdatesFoundEventArgs.vb create mode 100644 Pilz.Updating/Pilz.Updating.vbproj create mode 100644 Pilz.Updating/Scripts/Script.vb create mode 100644 Pilz.Updating/Scripts/ScriptManager.vb create mode 100644 Pilz.Updating/Scripts/ScriptPriority.vb create mode 100644 Pilz.Updating/UpdateManager create mode 100644 Pilz.Updating/Updater.vb create mode 100644 Pilz.Updating/packages.config create mode 100644 Pilz/HelpfulFunctions.vb create mode 100644 Shared Libs/AssimpNet.dll create mode 100644 Shared Libs/ColladaSchema.dll diff --git a/Pilz.Collections/Pilz.Collections.vbproj b/Pilz.Collections/Pilz.Collections.vbproj index b0fc5b8..654c6b2 100644 --- a/Pilz.Collections/Pilz.Collections.vbproj +++ b/Pilz.Collections/Pilz.Collections.vbproj @@ -98,7 +98,7 @@ - + diff --git a/Pilz.Collections/SimpleHistory/ObjectValueType.vb b/Pilz.Collections/SimpleHistory/ObjectValueType.vb new file mode 100644 index 0000000..8438552 --- /dev/null +++ b/Pilz.Collections/SimpleHistory/ObjectValueType.vb @@ -0,0 +1,12 @@ +Namespace SimpleHistory + + ''' + ''' Specify which member types you would include. + ''' + Public Enum ObjectValueType + None = 0 + Field = 1 + [Property] = 2 + End Enum + +End Namespace \ No newline at end of file diff --git a/Pilz.Collections/SimpleHistory/SimpleHistory.vb b/Pilz.Collections/SimpleHistory/SimpleHistory.vb index 74c7339..a4d7d88 100644 --- a/Pilz.Collections/SimpleHistory/SimpleHistory.vb +++ b/Pilz.Collections/SimpleHistory/SimpleHistory.vb @@ -32,15 +32,12 @@ Namespace SimpleHistory Dim ret As HistoryPoint If stackPast.Count > 0 Then - Dim hp As HistoryPoint = stackPast.Pop hp.Undo() stackFuture.Push(hp) ret = hp - Else ret = Nothing - End If Return ret @@ -53,15 +50,12 @@ Namespace SimpleHistory Dim ret As HistoryPoint If stackFuture.Count > 0 Then - Dim hp As HistoryPoint = stackFuture.Pop hp.Redo() stackPast.Push(hp) ret = hp - Else ret = Nothing - End If Return ret diff --git a/Pilz.Configuration/Pilz.Configuration.vbproj b/Pilz.Configuration/Pilz.Configuration.vbproj index 6d1c540..5f5d09f 100644 --- a/Pilz.Configuration/Pilz.Configuration.vbproj +++ b/Pilz.Configuration/Pilz.Configuration.vbproj @@ -45,7 +45,7 @@ - ..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll + ..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll diff --git a/Pilz.Configuration/packages.config b/Pilz.Configuration/packages.config index 7f83af3..93b0be8 100644 --- a/Pilz.Configuration/packages.config +++ b/Pilz.Configuration/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/Pilz.Drawing.Drawing3D.OpenGLRenderer/Pilz.Drawing.Drawing3D.OpenGLFactory.vbproj b/Pilz.Drawing.Drawing3D.OpenGLRenderer/Pilz.Drawing.Drawing3D.OpenGLFactory.vbproj index 1829246..ad9d693 100644 --- a/Pilz.Drawing.Drawing3D.OpenGLRenderer/Pilz.Drawing.Drawing3D.OpenGLFactory.vbproj +++ b/Pilz.Drawing.Drawing3D.OpenGLRenderer/Pilz.Drawing.Drawing3D.OpenGLFactory.vbproj @@ -43,11 +43,11 @@ On - - ..\packages\OpenTK.3.0.1\lib\net20\OpenTK.dll + + ..\packages\OpenTK.3.1.0\lib\net20\OpenTK.dll - - ..\packages\OpenTK.GLControl.3.0.1\lib\net20\OpenTK.GLControl.dll + + ..\packages\OpenTK.GLControl.3.1.0\lib\net20\OpenTK.GLControl.dll diff --git a/Pilz.Drawing.Drawing3D.OpenGLRenderer/Preview/ModelPreview.vb b/Pilz.Drawing.Drawing3D.OpenGLRenderer/Preview/ModelPreview.vb index 2990e15..3744f88 100644 --- a/Pilz.Drawing.Drawing3D.OpenGLRenderer/Preview/ModelPreview.vb +++ b/Pilz.Drawing.Drawing3D.OpenGLRenderer/Preview/ModelPreview.vb @@ -23,7 +23,6 @@ Namespace PreviewN Private camMtx As Matrix4 = Matrix4.Identity Private savedCamPos As New Vector3 Private _isMouseDown As Boolean = False - 'Private myPressedKeys As New List(Of Keys) Private isDeactivated As Boolean = False Private ReadOnly myModels As New Dictionary(Of Object3D, Renderer) @@ -32,12 +31,6 @@ Namespace PreviewN Public Property Scaling As Single = 500.0F Public Property ClearColor As Color = Color.CornflowerBlue - 'Public ReadOnly Property PressedKeys As IReadOnlyList(Of Keys) - ' Get - ' Return myPressedKeys - ' End Get - 'End Property - Public ReadOnly Property Camera As Camera Get Return MyCamera @@ -56,9 +49,14 @@ Namespace PreviewN End Get End Property + Public ReadOnly Property GLControl As Control + Get + Return glControl1 + End Get + End Property + Private ReadOnly Property IsStrgPressed As Boolean Get - 'Return myPressedKeys.Contains(Keys.ControlKey) Dim state As KeyboardState = Keyboard.GetState() Return state(Key.ControlLeft) OrElse state(Key.ControlRight) End Get @@ -66,7 +64,6 @@ Namespace PreviewN Private ReadOnly Property IsShiftPressed As Boolean Get - 'Return myPressedKeys.Contains(Keys.ShiftKey) Dim state As KeyboardState = Keyboard.GetState() Return state(Key.ShiftLeft) OrElse state(Key.ShiftRight) End Get @@ -142,7 +139,6 @@ Namespace PreviewN Public Sub UpdateView() glControl1.Invalidate() - 'glControl1.Update() End Sub Public Function AddModel(obj As Object3D) As Renderer @@ -226,38 +222,8 @@ Namespace PreviewN Next glControl1.SwapBuffers() - - 'If Not IsMouseDown AndAlso obj3d IsNot Nothing Then - ' e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias - ' e.Graphics.DrawString(GetModelInfoAsString, New Font(FontFamily.GenericSerif, 10), New SolidBrush(Panel1.ForeColor), New Drawing.Point(10, 10)) - 'End If End Sub - Private Function GetModelInfoAsString() As String - Dim matsCount As Long = 0 - Dim facesCount As Long = 0 - Dim vertsCount As Long = 0 - Dim vcCount As Long = 0 - Dim uvCount As Long = 0 - - For Each obj3d As Object3D In myModels.Keys - matsCount += obj3d.Materials.Count - For Each m As Mesh In obj3d.Meshes - vertsCount += m.Vertices.Count - facesCount += m.Faces.Count - vcCount += m.VertexColors.Count - uvCount += m.UVs.Count - Next - Next - - Return String.Format("Materials:{0}{1} -Faces:{0}{0}{2} -Vertices:{0}{3} -Vertex Colors{0}{4} -UVs:{0}{0}{5}", - vbTab, matsCount, facesCount, vertsCount, vcCount, uvCount) - End Function - Private Sub glControl1_Resize(sender As Object, e As EventArgs) Handles glControl1.Resize glControl1.Context.Update(glControl1.WindowInfo) GL.Viewport(0, 0, glControl1.Width, glControl1.Height) @@ -293,44 +259,10 @@ UVs:{0}{0}{5}", End If End Sub - 'Public Sub HandlesOnKeyDown(sender As Object, e As KeyEventArgs) Handles glControl1.KeyDown - ' If Not myPressedKeys.Contains(e.KeyCode) Then myPressedKeys.Add(e.KeyCode) - 'End Sub - - 'Public Sub HandlesOnKeyUp(sender As Object, e As KeyEventArgs) Handles MyBase.KeyUp - ' If myPressedKeys.Contains(e.KeyCode) Then myPressedKeys.Remove(e.KeyCode) - 'End Sub - Public Sub MoveCameraViaWASDQE() Dim moveSpeed As Integer = Convert.ToInt32(Math.Round((If(IsShiftPressed, 60, 30)) * (MyCamera.CamSpeedMultiplier), 0)) Dim allowCamMove As Boolean = Not (IsMouseDown AndAlso IsShiftPressed) - 'For Each k As Keys In myPressedKeys - ' If allowCamMove Then - ' Select Case k - ' Case Keys.W - ' 'camera.Move(moveSpeed, moveSpeed, camMtx) - ' MyCamera.UpdateCameraMatrixWithScrollWheel(moveSpeed, camMtx) - ' savedCamPos = MyCamera.Position - ' Case Keys.S - ' 'camera.Move(-moveSpeed, -moveSpeed, camMtx) - ' MyCamera.UpdateCameraMatrixWithScrollWheel(-moveSpeed, camMtx) - ' savedCamPos = MyCamera.Position - ' Case Keys.A - ' 'camera.Move(-moveSpeed, 0, camMtx) - ' MyCamera.UpdateCameraOffsetDirectly(-moveSpeed, 0, camMtx) - ' Case Keys.D - ' 'camera.Move(moveSpeed, 0, camMtx) - ' MyCamera.UpdateCameraOffsetDirectly(moveSpeed, 0, camMtx) - ' Case Keys.E - ' 'camera.Move(0, -moveSpeed, camMtx) - ' MyCamera.UpdateCameraOffsetDirectly(0, -moveSpeed, camMtx) - ' Case Keys.Q - ' 'camera.Move(0, moveSpeed, camMtx) - ' MyCamera.UpdateCameraOffsetDirectly(0, moveSpeed, camMtx) - ' End Select - ' End If - 'Next If allowCamMove Then Dim state As KeyboardState = Keyboard.GetState diff --git a/Pilz.Drawing.Drawing3D.OpenGLRenderer/packages.config b/Pilz.Drawing.Drawing3D.OpenGLRenderer/packages.config index d8280d7..0a27f2e 100644 --- a/Pilz.Drawing.Drawing3D.OpenGLRenderer/packages.config +++ b/Pilz.Drawing.Drawing3D.OpenGLRenderer/packages.config @@ -1,6 +1,6 @@  - - + + \ No newline at end of file diff --git a/Pilz.Drawing/HelpfulDrawingFunctions.vb b/Pilz.Drawing/HelpfulDrawingFunctions.vb index b7d74d3..5fb2c28 100644 --- a/Pilz.Drawing/HelpfulDrawingFunctions.vb +++ b/Pilz.Drawing/HelpfulDrawingFunctions.vb @@ -1,9 +1,9 @@ Imports System.Drawing Imports System.Drawing.Drawing2D -Public Class HelpfulDrawingFunctions +Public Module HelpfulDrawingFunctions - Public Shared Function IsPointInRectangle(p As PointF, rect As RectangleF) As Boolean + Public Function IsPointInRectangle(p As PointF, rect As RectangleF) As Boolean Dim bList As New List(Of Boolean) bList.Add(p.X > rect.Left) @@ -14,11 +14,20 @@ Public Class HelpfulDrawingFunctions Return Not bList.Contains(False) End Function - Public Shared Function OverlapsTwoRectangles(a As RectangleF, b As RectangleF) As Boolean + Public Function OverlapsTwoRectangles(a As RectangleF, b As RectangleF) As Boolean Return a.IntersectsWith(b) 'RectangleF.Intersect(a, b) <> RectangleF.Empty End Function - Public Shared Function GetRectangle(p1 As PointF, p2 As PointF) As RectangleF + Public Function RectangleContainsRectangle(parent As RectangleF, child As RectangleF) As Boolean + Return parent.Contains(child) + 'Return _ + ' IsPointInRectangle(New PointF(child.Top, child.Left), parent) AndAlso + ' IsPointInRectangle(New PointF(child.Top, child.Right), parent) AndAlso + ' IsPointInRectangle(New PointF(child.Bottom, child.Left), parent) AndAlso + ' IsPointInRectangle(New PointF(child.Bottom, child.Right), parent) + End Function + + Public Function GetRectangle(p1 As PointF, p2 As PointF) As RectangleF Dim rect As New RectangleF Dim startIsEnd As Boolean = p1.X > p2.X AndAlso p1.Y > p2.Y @@ -37,5 +46,5 @@ Public Class HelpfulDrawingFunctions Return rect End Function -End Class +End Module diff --git a/Pilz.Networking/ConnectionManagerBase.vb b/Pilz.Networking/ConnectionManagerBase.vb new file mode 100644 index 0000000..7c0fa48 --- /dev/null +++ b/Pilz.Networking/ConnectionManagerBase.vb @@ -0,0 +1,84 @@ +Imports System.IO +Imports Newtonsoft.Json.Linq + +Public MustInherit Class ConnectionManagerBase + + Private listening As Boolean = False + + Public ReadOnly Property Port As Integer + + Public Event RetriveData(manager As ConnectionManagerBase, senderIP As String, cmd As String, content As Object) + + Public Property IsListening As Boolean + Get + Return listening + End Get + Protected Set(value As Boolean) + listening = value + End Set + End Property + + Public Sub New(port As Integer) + Me.Port = port + End Sub + + Protected Overrides Sub Finalize() + [Stop]() + End Sub + + Public MustOverride Sub Start() + Public MustOverride Sub [Stop]() + Public MustOverride Sub Send(empfängerIP As String, cmd As String, content As Object) + + Public Overridable Sub Send(empfängerIP As String, cmd As String) + Send(empfängerIP, cmd, String.Empty) + End Sub + + Public Overridable Sub Send(empfängerIP As String, cmd As String, info As String) + Send(empfängerIP, cmd, CObj(info)) + End Sub + + Public Sub RaiseRetriveData(senderIP As String, cmd As String, content As Object) + RaiseEvent RetriveData(Me, senderIP, cmd, content) + End Sub + + Protected Shared Function EncodeToBytes(cmd As String, content As Object) As Byte() + Dim ms As New MemoryStream() + Dim bw As New BinaryWriter(ms) + Dim obj As New JObject + + 'Write header + obj("Cmd") = cmd + obj("ContentType") = content?.GetType?.ToString + + 'Content + obj("Content") = JToken.FromObject(content) + + 'Write Json to MemoryStream + bw.Write(Text.Encoding.Default.GetBytes(obj.ToString)) + + 'Get Buffer Bytes + Dim buf As Byte() = ms.ToArray + ms.Close() + + Return buf + End Function + + Protected Shared Function DecodeFromBytes(buf As Byte()) As (cmd As String, content As Object) + Dim contentstring As String = Text.Encoding.Default.GetString(buf) + Dim content As Object = Nothing + Dim contentobj As JObject = JObject.Parse(contentstring) + + Dim cmd As String = contentobj("Cmd") + Dim contenttypestring As String = contentobj("ContentType") + Dim contentlinq As JToken = contentobj("Content") + + If Not String.IsNullOrEmpty(contenttypestring) Then + Dim contenttype As Type = Type.GetType(contenttypestring) + content = contentlinq.ToObject(contenttype) + End If + + Return (cmd, content) + End Function + +End Class diff --git a/Pilz.Networking/My Project/Application.Designer.vb b/Pilz.Networking/My Project/Application.Designer.vb new file mode 100644 index 0000000..88dd01c --- /dev/null +++ b/Pilz.Networking/My Project/Application.Designer.vb @@ -0,0 +1,13 @@ +'------------------------------------------------------------------------------ +' +' 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. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + diff --git a/Pilz.Networking/My Project/Application.myapp b/Pilz.Networking/My Project/Application.myapp new file mode 100644 index 0000000..758895d --- /dev/null +++ b/Pilz.Networking/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + false + false + 0 + true + 0 + 1 + true + diff --git a/Pilz.Networking/My Project/AssemblyInfo.vb b/Pilz.Networking/My Project/AssemblyInfo.vb new file mode 100644 index 0000000..c81f2f8 --- /dev/null +++ b/Pilz.Networking/My Project/AssemblyInfo.vb @@ -0,0 +1,35 @@ +Imports System +Imports System.Reflection +Imports 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. + +' Werte der Assemblyattribute überprüfen + + + + + + + + + + +'Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird. + + +' 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: +' + + + diff --git a/Pilz.Networking/My Project/Resources.Designer.vb b/Pilz.Networking/My Project/Resources.Designer.vb new file mode 100644 index 0000000..a2b623f --- /dev/null +++ b/Pilz.Networking/My Project/Resources.Designer.vb @@ -0,0 +1,62 @@ +'------------------------------------------------------------------------------ +' +' 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. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My.Resources + + 'This class was auto-generated by the StronglyTypedResourceBuilder + 'class via a tool like ResGen or Visual Studio. + 'To add or remove a member, edit your .ResX file then rerun ResGen + 'with the /str option, or rebuild your VS project. + ''' + ''' A strongly-typed resource class, for looking up localized strings, etc. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Returns the cached ResourceManager instance used by this class. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("Pilz.Networking.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Overrides the current thread's CurrentUICulture property for all + ''' resource lookups using this strongly typed resource class. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set(ByVal value As Global.System.Globalization.CultureInfo) + resourceCulture = value + End Set + End Property + End Module +End Namespace diff --git a/Pilz.Networking/My Project/Resources.resx b/Pilz.Networking/My Project/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pilz.Networking/My Project/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/Pilz.Networking/My Project/Settings.Designer.vb b/Pilz.Networking/My Project/Settings.Designer.vb new file mode 100644 index 0000000..ee067b4 --- /dev/null +++ b/Pilz.Networking/My Project/Settings.Designer.vb @@ -0,0 +1,73 @@ +'------------------------------------------------------------------------------ +' +' 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. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings), MySettings) + +#Region "My.Settings Auto-Save Functionality" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.Pilz.Networking.My.MySettings + Get + Return Global.Pilz.Networking.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/Pilz.Networking/My Project/Settings.settings b/Pilz.Networking/My Project/Settings.settings new file mode 100644 index 0000000..85b890b --- /dev/null +++ b/Pilz.Networking/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pilz.Networking/NetworkFeatures.vb b/Pilz.Networking/NetworkFeatures.vb new file mode 100644 index 0000000..3c2f5df --- /dev/null +++ b/Pilz.Networking/NetworkFeatures.vb @@ -0,0 +1,54 @@ +Imports System.Net +Imports System.Net.NetworkInformation +Imports System.Net.Sockets + +Public Module NetworkFeatures + + Public Function GetIPFromHost(hostName As String) As IPAddress + Return Dns.GetHostAddresses(hostName).FirstOrDefault(Function(n) n.AddressFamily = AddressFamily.InterNetwork) + End Function + + Public Function GetHostFromIP(ip As String) + Return Dns.GetHostEntry(ip)?.HostName + End Function + + Public Function GetLocalIPInformations() As UnicastIPAddressInformation + Dim addr As UnicastIPAddressInformation = Nothing + + For Each adapter As NetworkInterface In NetworkInterface.GetAllNetworkInterfaces + If addr Is Nothing AndAlso adapter.OperationalStatus = OperationalStatus.Up AndAlso adapter.NetworkInterfaceType <> NetworkInterfaceType.Tunnel AndAlso adapter.NetworkInterfaceType <> NetworkInterfaceType.Loopback Then + For Each uni As UnicastIPAddressInformation In adapter.GetIPProperties.UnicastAddresses + If addr Is Nothing AndAlso uni.Address.AddressFamily = AddressFamily.InterNetwork Then + addr = uni + End If + Next + End If + Next + + Return addr + End Function + + Public Function GetLocalIPAddress() As IPAddress + Return GetLocalIPInformations()?.Address + End Function + + Public Function GetLocalIPv4Mask() As IPAddress + Return GetLocalIPInformations()?.IPv4Mask + End Function + + Public Function GetLocalBoradcastIP(ipInfo As UnicastIPAddressInformation) As IPAddress + Dim ip As IPAddress = Nothing + Dim myIPBytes As Byte() = ipInfo.Address.GetAddressBytes + Dim subnetBytes As Byte() = ipInfo.IPv4Mask.GetAddressBytes + Dim broadcastBytes As Byte() = New Byte(myIPBytes.Length - 1) {} + + For i As Integer = 0 To subnetBytes.Length - 1 + broadcastBytes(i) = myIPBytes(i) Or Not subnetBytes(i) + Next + + ip = New IPAddress(broadcastBytes) + + Return ip + End Function + +End Module diff --git a/Pilz.Networking/Pilz.Networking.vbproj b/Pilz.Networking/Pilz.Networking.vbproj new file mode 100644 index 0000000..20c6cb5 --- /dev/null +++ b/Pilz.Networking/Pilz.Networking.vbproj @@ -0,0 +1,114 @@ + + + + + Debug + AnyCPU + {4584B121-09C6-40AC-849B-7E410125EF66} + Library + Pilz.Networking + Pilz.Networking + 512 + Windows + v4.5 + true + + + true + full + true + true + bin\Debug\ + Pilz.Networking.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + pdbonly + false + true + true + bin\Release\ + Pilz.Networking.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + On + + + Binary + + + Off + + + On + + + + ..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll + + + + + ..\..\ConsoleApp2\packages\System.ValueTuple.4.5.0\lib\netstandard1.0\System.ValueTuple.dll + + + + + + + + + + + + + + + + + + + + + + + True + Application.myapp + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + + \ No newline at end of file diff --git a/Pilz.Networking/TCPManager.vb b/Pilz.Networking/TCPManager.vb new file mode 100644 index 0000000..fe032c5 --- /dev/null +++ b/Pilz.Networking/TCPManager.vb @@ -0,0 +1,83 @@ +Imports System.IO +Imports System.Net +Imports System.Net.NetworkInformation +Imports System.Net.Sockets +Imports Newtonsoft.Json.Linq + +Public Class TCPManager + Inherits ConnectionManagerBase + + Private ReadOnly listener As TcpListener + Public Property BufferSize As Integer = 10240 + + Public Sub New(port As Integer) + MyBase.New(port) + listener = New TcpListener(IPAddress.Any, port) + End Sub + + Public Overrides Sub Start() + If Not IsListening Then + listener.Start() + IsListening = True + Task.Run(AddressOf CheckRetriveData) + End If + End Sub + + ''' + ''' Stop listening on given port. + ''' + Public Overrides Sub [Stop]() + If IsListening Then + IsListening = False + listener.Stop() + End If + End Sub + + Private Sub CheckRetriveData() + Do While IsListening + If listener.Pending Then + Dim tcp As TcpClient = listener.AcceptTcpClient() + Dim ip As String = CType(tcp.Client.RemoteEndPoint, IPEndPoint).Address.ToString + Dim Stream As NetworkStream = tcp.GetStream + Dim buf As Byte() = New Byte(BufferSize - 1) {} + + tcp.ReceiveBufferSize = BufferSize + Stream.Read(buf, 0, buf.Length) + + Dim contentstring As String = Text.Encoding.Default.GetString(buf) + Dim content As Object = Nothing + Dim cmd As String = String.Empty + + Try + Dim res = DecodeFromBytes(buf) + cmd = res.cmd + content = res.content + Catch ex As Exception + End Try + + tcp.Close() + + RaiseRetriveData(ip, cmd, content) + End If + Loop + End Sub + + Public Overrides Sub Send(empfängerIP As String, cmd As String, content As Object) + Dim ep As New IPEndPoint(GetIPFromHost(empfängerIP).MapToIPv4, Port) + Dim tcp As New TcpClient + + tcp.SendBufferSize = BufferSize + tcp.Connect(ep) + + Dim stream As NetworkStream = tcp.GetStream() + Dim buf As Byte() = EncodeToBytes(cmd, content) + + 'Send Data + stream.Write(buf, 0, buf.Length) + stream.Flush() + + tcp.Client.Shutdown(SocketShutdown.Both) + tcp.Close() + End Sub + +End Class diff --git a/Pilz.Networking/UDPManager.vb b/Pilz.Networking/UDPManager.vb new file mode 100644 index 0000000..01b57d0 --- /dev/null +++ b/Pilz.Networking/UDPManager.vb @@ -0,0 +1,94 @@ +Imports System.IO +Imports System.Net +Imports System.Net.NetworkInformation +Imports System.Net.Sockets +Imports System.Threading +Imports Newtonsoft.Json.Linq + +Public Class UDPManager + Inherits ConnectionManagerBase + + Private ReadOnly client As UdpClient + Private listenTask As Task = Nothing + Private ReadOnly cancelTokenSource As New CancellationTokenSource + Private ReadOnly cancelToken As CancellationToken = cancelTokenSource.Token + + Public Sub New(port As Integer) + MyBase.New(port) + client = New UdpClient(port) + End Sub + + Protected Overrides Sub Finalize() + MyBase.Finalize() + client.Client.Shutdown(SocketShutdown.Both) + client.Close() + End Sub + + Public Overrides Sub Start() + If Not IsListening Then + StartInternal() + End If + End Sub + + Private Sub StartInternal() + IsListening = True + listenTask = Task.Run( + Sub() + Try + RetriveAnyData(cancelToken) + Catch ex As Exception + IsListening = False + End Try + End Sub) + End Sub + + ''' + ''' Stop listening on given port. + ''' + Public Overrides Sub [Stop]() + If IsListening Then + IsListening = False + cancelTokenSource.Cancel() + listenTask.Wait() + End If + End Sub + + Private Sub RetriveAnyData(ct As CancellationToken) + Dim doExit = Sub() ct.ThrowIfCancellationRequested() + Dim receiveTask As Task(Of UdpReceiveResult) = client.ReceiveAsync() + + 'Wait for the data and cancel if requested + receiveTask.Wait(ct) + + Dim buf As Byte() = receiveTask.Result.Buffer + Dim ip As String = receiveTask.Result.RemoteEndPoint.Address.ToString + Dim cmd As String = String.Empty + Dim content As Object = Nothing + + doExit() + + Try + Dim res = DecodeFromBytes(buf) + cmd = res.cmd + content = res.content + Catch ex As Exception + End Try + + RaiseRetriveData(ip, cmd, content) + + doExit() + StartInternal() + End Sub + + Public Overrides Sub Send(empfängerIP As String, cmd As String, content As Object) + Dim ep As New IPEndPoint(GetIPFromHost(empfängerIP).MapToIPv4, Port) + Dim udp As New UdpClient + Dim buf As Byte() = EncodeToBytes(cmd, content) + + udp.Connect(ep) + udp.Send(buf, buf.Length) + udp.Client.Shutdown(SocketShutdown.Both) + udp.Close() + End Sub + +End Class diff --git a/Pilz.Networking/packages.config b/Pilz.Networking/packages.config new file mode 100644 index 0000000..5f639a6 --- /dev/null +++ b/Pilz.Networking/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Pilz.Simple3DFileParser/Model/Mesh.vb b/Pilz.Simple3DFileParser/Model/Mesh.vb index 53dfa0b..392c850 100644 --- a/Pilz.Simple3DFileParser/Model/Mesh.vb +++ b/Pilz.Simple3DFileParser/Model/Mesh.vb @@ -8,34 +8,35 @@ Public Class Mesh Public ReadOnly Property VertexColors As New List(Of VertexColor) Public ReadOnly Property Faces As New List(Of Face) - Friend Function GetCenterModelAvg() As Vector3 + Public Sub CenterModel() + CenterModel({Me}) + End Sub + + Public Shared Sub CenterModel(meshes As IEnumerable(Of Mesh)) Dim avgX As Integer = 0 Dim avgY As Integer = 0 Dim avgZ As Integer = 0 + Dim vertsCount As Long = 0 - For Each v As Vertex In Vertices - avgX += v.X - avgY += v.Y - avgZ += v.Z + For Each m As Mesh In meshes + For Each v As Vertex In m.Vertices + avgX += v.X + avgY += v.Y + avgZ += v.Z + Next + vertsCount += m.Vertices.Count Next - Return New Vector3(avgX, avgY, avgZ) - End Function + Dim avg As New Vector3(avgX, avgY, avgZ) + avg /= New Vector3(vertsCount) - Public Sub CenterModel() - Dim avg As Vector3 = GetCenterModelAvg() - - avg /= New Vector3(Vertices.Count) - - CenterModel(avg) - End Sub - - Public Sub CenterModel(avg As Vector3) - For Each v As Vertex In Vertices - v.X -= avg.X - v.Y -= avg.Y - v.Z -= avg.Z + For Each m As Mesh In meshes + For Each v As Vertex In m.Vertices + v.X -= avg.X + v.Y -= avg.Y + v.Z -= avg.Z + Next Next End Sub -End Class \ No newline at end of file +End Class diff --git a/Pilz.Simple3DFileParser/Model/Object3D.vb b/Pilz.Simple3DFileParser/Model/Object3D.vb index 52e5aa8..7e36721 100644 --- a/Pilz.Simple3DFileParser/Model/Object3D.vb +++ b/Pilz.Simple3DFileParser/Model/Object3D.vb @@ -179,22 +179,17 @@ Public Class Object3D End Function Public Sub CenterModel() - Dim avg As Vector3 = Vector3.Zero - Dim vertsCount As ULong = 0 - - For Each m As Mesh In Meshes - avg += m.GetCenterModelAvg - vertsCount += m.Vertices.Count - Next - - avg /= vertsCount - - CenterModel(avg) + Mesh.CenterModel(Meshes) End Sub - Public Sub CenterModel(avg As Vector3) - For Each m As Mesh In Meshes - m.CenterModel(avg) + + Public Shared Sub CenterModel(objs As IEnumerable(Of Object3D)) + Dim meshes As New List(Of Mesh) + + For Each obj As Object3D In objs + meshes.AddRange(obj.Meshes) Next + + Mesh.CenterModel(meshes) End Sub End Class diff --git a/Pilz.Simple3DFileParser/Other/LoaderModule.vb b/Pilz.Simple3DFileParser/Other/LoaderModule.vb index a34a287..620657f 100644 --- a/Pilz.Simple3DFileParser/Other/LoaderModule.vb +++ b/Pilz.Simple3DFileParser/Other/LoaderModule.vb @@ -69,8 +69,11 @@ Public Class File3DLoaderModule AssimpModule.AssimpLoader.LoadAssimpLibs() Dim exts As New Dictionary(Of String, String) For Each fd As Assimp.ExportFormatDescription In AssimpLibrary.Instance.GetExportFormatDescriptions - If Not exts.ContainsKey(fd.FileExtension) Then exts.Add(fd.FileExtension, fd.FormatId & " - " & fd.Description) + If Not exts.ContainsKey(fd.FileExtension) Then + exts.Add(fd.FileExtension, fd.FormatId & " - " & fd.Description) + End If Next + exts.Add("blend", "Blender") list.Add(New File3DLoaderModule("Assimp", AddressOf LoadViaAssimp, diff --git a/Pilz.Simple3DFileParser/Pilz.Simple3DFileParser.vbproj b/Pilz.Simple3DFileParser/Pilz.Simple3DFileParser.vbproj index 058d877..88d207c 100644 --- a/Pilz.Simple3DFileParser/Pilz.Simple3DFileParser.vbproj +++ b/Pilz.Simple3DFileParser/Pilz.Simple3DFileParser.vbproj @@ -52,12 +52,11 @@ ..\packages\Aspose.3D.18.4.0\lib\net40\Aspose.3D.dll - - False + ..\Shared Libs\AssimpNet.dll - ..\..\..\DLL's\ColladaSchema.dll + ..\Shared Libs\ColladaSchema.dll diff --git a/Pilz.UI/PaintingControl/DefaultDrawMethodes.vb b/Pilz.UI/PaintingControl/DefaultDrawMethodes.vb index d76539a..b802cb7 100644 --- a/Pilz.UI/PaintingControl/DefaultDrawMethodes.vb +++ b/Pilz.UI/PaintingControl/DefaultDrawMethodes.vb @@ -143,20 +143,18 @@ Public Class DefaultDrawMethodes Public Shared Sub DrawTriangle(e As PaintingObjectPaintEventArgs) Dim obj As PaintingObject = e.PaintingObject + Dim p1 As New Point(obj.Size.Width / 2 + e.X, e.Y) + Dim p2 As New Point(e.X, e.Y + obj.Size.Height) + Dim p3 As New Point(e.X + obj.Size.Width, e.Y + obj.Size.Height) + If obj.EnableFill Then Dim b As New SolidBrush(obj.FillColor) - Dim p1 As New Point(obj.Size.Width / 2 + e.X, e.Y) - Dim p2 As New Point(e.X, e.Y + obj.Size.Height) - Dim p3 As New Point(e.X + obj.Size.Width, e.Y + obj.Size.Height) e.Graphics.FillPolygon(b, {p1, p2, p3}) End If If obj.EnableOutline Then Dim lw As Single = obj.OutlineThicknes Dim p As New Pen(obj.OutlineColor, obj.OutlineThicknes) With {.DashStyle = obj.OutlineDashStyle, .Alignment = PenAlignment.Inset} - Dim p1 As New Point(obj.Size.Width / 2 + e.X, e.Y) - Dim p2 As New Point(e.X, e.Y + obj.Size.Height) - Dim p3 As New Point(e.X + obj.Size.Width, e.Y + obj.Size.Height) e.Graphics.DrawPolygon(p, {p1, p2, p3}) End If End Sub @@ -225,10 +223,10 @@ Public Class DefaultDrawMethodes End Sub Public Shared Sub DrawAreaSelection(e As PaintEventArgs, pc As PaintingControl, startMousePos As PointF, lastMousePos As PointF) - Dim p As New Pen(pc.AreaSelectionColor) - p.DashStyle = DashStyle.DashDot - p.Width = 3 Dim rectToDraw As RectangleF = HelpfulDrawingFunctions.GetRectangle(startMousePos, lastMousePos) + Dim p As New Pen(pc.AreaSelectionColor) + p.DashStyle = If(startMousePos.X >= lastMousePos.X, DashStyle.DashDot, DashStyle.Solid) + p.Width = 3 e.Graphics.DrawRectangle(p, rectToDraw.X, rectToDraw.Y, rectToDraw.Width, rectToDraw.Height) End Sub diff --git a/Pilz.UI/PaintingControl/PaintingControl.vb b/Pilz.UI/PaintingControl/PaintingControl.vb index bbc72a7..fb0f27e 100644 --- a/Pilz.UI/PaintingControl/PaintingControl.vb +++ b/Pilz.UI/PaintingControl/PaintingControl.vb @@ -23,6 +23,8 @@ Public Class PaintingControl Public Property Offset As PointF = PointF.Empty Public ReadOnly Property PaintingObjects As New PaintingObjectList(Me) + 'Public Property EnableRealTransparency As Boolean = False + Public Property VisibleForMouseEvents As Boolean = True Public Property AutoAreaSelection As Boolean = True Public Property AutoSingleSelection As Boolean = True Public Property AutoMultiselection As Boolean = True @@ -90,9 +92,10 @@ Public Class PaintingControl End Get Set(value As Color) bgColor = value - If value <> Color.Transparent Then - MyBase.BackColor = value - End If + MyBase.BackColor = value + 'If value <> Color.Transparent Then + ' MyBase.BackColor = value + 'End If End Set End Property Public ReadOnly Property IsAreaSelecting As Boolean @@ -114,6 +117,7 @@ Public Class PaintingControl End Property Public Sub New() + 'SetStyle(ControlStyles.Opaque, True) 'For real transparency DoubleBuffered = True End Sub @@ -150,7 +154,7 @@ Public Class PaintingControl curObjMouseDown = GetObjects(lastMousePos).Where(Function(n) Not n.MouseTransparency).LastOrDefault curObjMouseDown?.RaiseMouseDown(GetMouseEventArgs(e, curObjMouseDown)) - If Not GetSelectedObjects.Contains(curObjMouseDown) Then + If curObjMouseDown Is Nothing OrElse Not curObjMouseDown.Selected OrElse pressedControl Then Dim hasMovedObjects As Boolean = False If _IsMovingObjects Then For Each obj As PaintingObject In GetSelectedObjects() @@ -164,7 +168,7 @@ Public Class PaintingControl If (Not hasMovedObjects) AndAlso (Not _IsAreaSelecting) Then Dim selChanged As New List(Of PaintingObject) - If AutoRemoveSelection AndAlso Not pressedShift Then + If AutoRemoveSelection AndAlso Not pressedControl Then For Each obj As PaintingObject In PaintingObjects If obj.Selected Then obj.SelectedDirect = False @@ -175,9 +179,9 @@ Public Class PaintingControl Next End If - If AutoSingleSelection Then + If AutoSingleSelection AndAlso curObjMouseDown IsNot Nothing Then Dim objtosel As PaintingObject = curObjMouseDown - If objtosel?.EnableSelection Then + If objtosel.EnableSelection Then objtosel.SelectedDirect = Not objtosel.Selected If Not selChanged.Contains(objtosel) Then selChanged.Add(objtosel) @@ -418,7 +422,7 @@ Public Class PaintingControl Get Dim cp = MyBase.CreateParams - 'If EnableFullTransparentBackground Then + 'If EnableRealTransparency Then ' cp.ExStyle = cp.ExStyle Or &H20 'WS_EX_TRANSPARENT 'End If @@ -431,16 +435,14 @@ Public Class PaintingControl ''' ''' Protected Overrides Sub WndProc(ByRef m As Message) - Dim WM_NCHITTEST As Integer = &H84 - Dim HTTRANSPARENT As Integer = -1 + Const WM_NCHITTEST As Integer = &H84 + Const HTTRANSPARENT As Integer = -1 - 'If m.Msg = WM_NCHITTEST Then - ' m.Result = CType(HTTRANSPARENT, IntPtr) - 'Else - ' MyBase.WndProc(m) - 'End If - - MyBase.WndProc(m) + If Not VisibleForMouseEvents AndAlso m.Msg = WM_NCHITTEST Then + m.Result = CType(HTTRANSPARENT, IntPtr) + Else + MyBase.WndProc(m) + End If End Sub Protected Overrides Sub OnPaintBackground(e As PaintEventArgs) @@ -448,13 +450,13 @@ Public Class PaintingControl Me.SuspendLayout() 'Draw Background + 'If Not EnableRealTransparency Then MyBase.OnPaintBackground(e) + 'End If End Sub Protected Overrides Sub OnPaint(e As PaintEventArgs) - 'Do default Drawing Methode - MyBase.OnPaint(e) - + 'Draw PaintingObjects stuff If StopDrawing Then e.Graphics.DrawImage(bufferedImg, Point.Empty) Else @@ -482,6 +484,9 @@ Public Class PaintingControl End If End If + 'Do default Drawing Methode + MyBase.OnPaint(e) + 'Start Drawing directly to the Form ResumeLayout(False) End Sub @@ -501,53 +506,76 @@ Public Class PaintingControl Private Function CalcTextSize(obj As PaintingObject) As SizeF Return CalcTextSize(obj, Parent.CreateGraphics) End Function + Private Function CalcTextSize(obj As PaintingObject, g As Graphics) As SizeF Return g.MeasureString(obj.Text, obj.TextFont, obj.Width) End Function Private Sub SelectControlsInArea() - Dim rect As RectangleF = HelpfulDrawingFunctions.GetRectangle(startMousePos, lastMousePos) + Dim rect As RectangleF = GetRectangle(startMousePos, lastMousePos) For Each obj As PaintingObject In PaintingObjects - obj.Selected = HelpfulDrawingFunctions.OverlapsTwoRectangles(obj.Rectangle, rect) + obj.Selected = If(startMousePos.X >= lastMousePos.X, + OverlapsTwoRectangles(obj.Rectangle, rect), + RectangleContainsRectangle(rect, obj.Rectangle)) Next End Sub - Public Sub ArrangeToGrid(obj As PaintingObject) - Dim zoomedGridChunkSize As New SizeF(GridChunkSize.Width * ZoomFactor.Width, Me.GridChunkSize.Height * ZoomFactor.Height) + Public Sub ArrangeToGrid(obj As PaintingObject, snapPinnedObjects As Boolean) + If snapPinnedObjects OrElse Not IsPinnedObject(obj) Then + Dim zoomedGridChunkSize As New SizeF(GridChunkSize.Width * ZoomFactor.Width, Me.GridChunkSize.Height * ZoomFactor.Height) - Dim modTop As Integer = obj.Y Mod zoomedGridChunkSize.Height - Dim modLeft As Integer = obj.X Mod zoomedGridChunkSize.Width + Dim modTop As Integer = obj.Y Mod zoomedGridChunkSize.Height + Dim modLeft As Integer = obj.X Mod zoomedGridChunkSize.Width - Dim halfHeight As Integer = zoomedGridChunkSize.Height / 2 - Dim halfWidth As Integer = zoomedGridChunkSize.Width / 2 + Dim halfHeight As Integer = zoomedGridChunkSize.Height / 2 + Dim halfWidth As Integer = zoomedGridChunkSize.Width / 2 - If modTop > halfHeight Then - obj.Y += (zoomedGridChunkSize.Height - modTop) - Else - obj.Y -= modTop - End If + Dim zoomLocation = + Sub(obj2 As PaintingObject) + If modTop > halfHeight Then + obj2.Y += (zoomedGridChunkSize.Height - modTop) + Else + obj2.Y -= modTop + End If - If modLeft > halfWidth Then - obj.X += (zoomedGridChunkSize.Width - modLeft) - Else - obj.X -= modLeft - End If + If modLeft > halfWidth Then + obj2.X += (zoomedGridChunkSize.Width - modLeft) + Else + obj2.X -= modLeft + End If + End Sub + + zoomLocation(obj) + + For Each pinned As PaintingObject In obj.PinnedObjects + zoomLocation(pinned) + Next - If obj.EnableResize AndAlso Not obj.HardcodedSize Then Dim modH As Integer = obj.Height Mod zoomedGridChunkSize.Height Dim modW As Integer = obj.Width Mod zoomedGridChunkSize.Width - If modH > halfHeight Then - obj.Height += (zoomedGridChunkSize.Height - modH) - Else - obj.Height -= modH - End If + Dim zoomSize = + Sub(obj2 As PaintingObject) + If obj2.EnableResize AndAlso Not obj2.HardcodedSize Then + If modH > halfHeight Then + obj2.Height += (zoomedGridChunkSize.Height - modH) + Else + obj2.Height -= modH + End If - If modW > halfWidth Then - obj.Width += (zoomedGridChunkSize.Width - modW) - Else - obj.Width -= modW - End If + If modW > halfWidth Then + obj2.Width += (zoomedGridChunkSize.Width - modW) + Else + obj2.Width -= modW + End If + End If + End Sub + + zoomSize(obj) + + For Each pinned As PaintingObject In obj.PinnedObjects + zoomSize(pinned) + Next End If End Sub @@ -564,7 +592,7 @@ Public Class PaintingControl If GridEnabled Then For Each obj As PaintingObject In GetSelectedObjects() If obj.AutoAlignToGrid Then - ArrangeToGrid(obj) + ArrangeToGrid(obj, False) End If Next If Not StopDrawing Then Refresh() diff --git a/Pilz.UI/PaintingControl/PaintingObject.vb b/Pilz.UI/PaintingControl/PaintingObject.vb index 97c90d8..b2bc438 100644 --- a/Pilz.UI/PaintingControl/PaintingObject.vb +++ b/Pilz.UI/PaintingControl/PaintingObject.vb @@ -432,7 +432,7 @@ Imports Newtonsoft.Json Public Sub ArrangeToGrid() If Parent IsNot Nothing Then - Parent.ArrangeToGrid(Me) + Parent.ArrangeToGrid(Me, True) If Not Parent.StopDrawing Then Parent.Refresh() End If End Sub diff --git a/Pilz.UI/PaintingControl/PaintingObjectResizing.vb b/Pilz.UI/PaintingControl/PaintingObjectResizing.vb index 76f1b9a..9edbea5 100644 --- a/Pilz.UI/PaintingControl/PaintingObjectResizing.vb +++ b/Pilz.UI/PaintingControl/PaintingObjectResizing.vb @@ -66,7 +66,6 @@ Imports Pilz.Drawing End Sub Private Sub mControl_MouseMove(sender As Object, e As MouseEventArgs) Handles mObjControl.MouseMove - If mMouseDown AndAlso mEdge <> EdgeEnum.None Then Dim eX As Integer = e.X + mObj.Parent.Offset.X @@ -97,6 +96,8 @@ Imports Pilz.Drawing Dim eXo As Integer = e.X Dim eYo As Integer = e.Y + Dim realX As Integer = eXo + mObj.Parent.Offset.X + Dim realY As Integer = eYo + mObj.Parent.Offset.Y Dim eXwo As Integer = eXo - mObj.X Dim eYwo As Integer = eYo - mObj.Y Dim eX As Integer = eXwo + mObj.Parent.Offset.X @@ -112,7 +113,7 @@ Imports Pilz.Drawing newRect.Height = (extRect.Height - oldRect.Height) / 2 Dim setToNone As Boolean = False - Dim isOnTop As Boolean = mObj.Parent.GetObject(New PointF(eXo, eYo), True) Is mObj + Dim isOnTop As Boolean = mObj.Parent.GetObject(New PointF(realX, realY), True) Is mObj If Enabled AndAlso isOnTop Then Select Case True diff --git a/Pilz.UI/Pilz.UI.vbproj b/Pilz.UI/Pilz.UI.vbproj index 772d1bb..945ae42 100644 --- a/Pilz.UI/Pilz.UI.vbproj +++ b/Pilz.UI/Pilz.UI.vbproj @@ -68,7 +68,7 @@ - ..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll + ..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll diff --git a/Pilz.UI/packages.config b/Pilz.UI/packages.config index 7f83af3..93b0be8 100644 --- a/Pilz.UI/packages.config +++ b/Pilz.UI/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/Pilz.Updating.Updater/App.config b/Pilz.Updating.Updater/App.config new file mode 100644 index 0000000..bc3672d --- /dev/null +++ b/Pilz.Updating.Updater/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Pilz.Updating.Updater/My Project/Application.Designer.vb b/Pilz.Updating.Updater/My Project/Application.Designer.vb new file mode 100644 index 0000000..8be2678 --- /dev/null +++ b/Pilz.Updating.Updater/My Project/Application.Designer.vb @@ -0,0 +1,38 @@ +'------------------------------------------------------------------------------ +' +' 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. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + 'HINWEIS: Diese Datei wird automatisch generiert und darf nicht direkt bearbeitet werden. Wenn Sie Änderungen vornehmen möchten + ' oder in dieser Datei Buildfehler auftreten, wechseln Sie zum Projekt-Designer. + ' (Wechseln Sie dazu zu den Projekteigenschaften, oder doppelklicken Sie auf den Knoten "Mein Projekt" im + ' Projektmappen-Explorer). Nehmen Sie auf der Registerkarte "Anwendung" entsprechende Änderungen vor. + ' + Partial Friend Class MyApplication + + _ + Public Sub New() + MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows) + Me.IsSingleInstance = false + Me.EnableVisualStyles = true + Me.SaveMySettingsOnExit = true + Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses + End Sub + + _ + Protected Overrides Sub OnCreateMainForm() + Me.MainForm = Global.Pilz.Updating.UpdateInstaller.Form1 + End Sub + End Class +End Namespace diff --git a/Pilz.Updating.Updater/My Project/Application.myapp b/Pilz.Updating.Updater/My Project/Application.myapp new file mode 100644 index 0000000..1243847 --- /dev/null +++ b/Pilz.Updating.Updater/My Project/Application.myapp @@ -0,0 +1,11 @@ + + + true + Form1 + false + 0 + true + 0 + 0 + true + diff --git a/Pilz.Updating.Updater/My Project/AssemblyInfo.vb b/Pilz.Updating.Updater/My Project/AssemblyInfo.vb new file mode 100644 index 0000000..ab0119f --- /dev/null +++ b/Pilz.Updating.Updater/My Project/AssemblyInfo.vb @@ -0,0 +1,35 @@ +Imports System +Imports System.Reflection +Imports 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. + +' Werte der Assemblyattribute überprüfen + + + + + + + + + + +'Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird. + + +' 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: +' + + + diff --git a/Pilz.Updating.Updater/My Project/Resources.Designer.vb b/Pilz.Updating.Updater/My Project/Resources.Designer.vb new file mode 100644 index 0000000..315ae38 --- /dev/null +++ b/Pilz.Updating.Updater/My Project/Resources.Designer.vb @@ -0,0 +1,63 @@ +'------------------------------------------------------------------------------ +' +' 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. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + +Imports System + +Namespace My.Resources + + 'Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert + '-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 /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. + ''' + ''' Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("Pilz.Updating.UpdateInstaller.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle + ''' Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set + resourceCulture = value + End Set + End Property + End Module +End Namespace diff --git a/Pilz.Updating.Updater/My Project/Resources.resx b/Pilz.Updating.Updater/My Project/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pilz.Updating.Updater/My Project/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/Pilz.Updating.Updater/My Project/Settings.Designer.vb b/Pilz.Updating.Updater/My Project/Settings.Designer.vb new file mode 100644 index 0000000..174e4f9 --- /dev/null +++ b/Pilz.Updating.Updater/My Project/Settings.Designer.vb @@ -0,0 +1,73 @@ +'------------------------------------------------------------------------------ +' +' 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. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings) + +#Region "Automatische My.Settings-Speicherfunktion" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.Pilz.Updating.UpdateInstaller.My.MySettings + Get + Return Global.Pilz.Updating.UpdateInstaller.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/Pilz.Updating.Updater/My Project/Settings.settings b/Pilz.Updating.Updater/My Project/Settings.settings new file mode 100644 index 0000000..85b890b --- /dev/null +++ b/Pilz.Updating.Updater/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pilz.Updating.Updater/Pilz.Updating.UpdateInstaller.vbproj b/Pilz.Updating.Updater/Pilz.Updating.UpdateInstaller.vbproj new file mode 100644 index 0000000..30ba063 --- /dev/null +++ b/Pilz.Updating.Updater/Pilz.Updating.UpdateInstaller.vbproj @@ -0,0 +1,136 @@ + + + + + Debug + AnyCPU + {1BA3D8E8-C514-4182-9E6E-9E6BB7AF0403} + WinExe + Pilz.Updating.UpdateInstaller.My.MyApplication + Pilz.Updating.UpdateInstaller + Pilz.Updating.UpdateInstaller + 512 + WindowsForms + v4.5 + true + + + AnyCPU + true + full + true + true + bin\Debug\ + Pilz.Updating.UpdateInstaller.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + AnyCPU + pdbonly + false + true + true + bin\Release\ + Pilz.Updating.UpdateInstaller.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + On + + + Binary + + + Off + + + On + + + + ..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + Form + + + UpdateInstaller.vb + Form + + + + True + Application.myapp + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + UpdateInstaller.vb + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + + + + {354255d9-9536-4400-b915-ffc49c2ce93f} + Pilz.Updating + + + {277d2b83-7613-4c49-9cab-e080195a6e0c} + Pilz + + + + \ No newline at end of file diff --git a/Pilz.Updating.Updater/UpdateInstaller.Designer.vb b/Pilz.Updating.Updater/UpdateInstaller.Designer.vb new file mode 100644 index 0000000..154fd55 --- /dev/null +++ b/Pilz.Updating.Updater/UpdateInstaller.Designer.vb @@ -0,0 +1,65 @@ + _ +Partial Class UpdateInstaller + Inherits System.Windows.Forms.Form + + 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen. + _ + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Wird vom Windows Form-Designer benötigt. + Private components As System.ComponentModel.IContainer + + 'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich. + 'Das Bearbeiten ist mit dem Windows Form-Designer möglich. + 'Das Bearbeiten mit dem Code-Editor ist nicht möglich. + _ + Private Sub InitializeComponent() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(UpdateInstaller)) + Me.ProgressBar1 = New System.Windows.Forms.ProgressBar() + Me.Label1 = New System.Windows.Forms.Label() + Me.SuspendLayout() + ' + 'ProgressBar1 + ' + Me.ProgressBar1.Location = New System.Drawing.Point(15, 25) + Me.ProgressBar1.Name = "ProgressBar1" + Me.ProgressBar1.Size = New System.Drawing.Size(390, 16) + Me.ProgressBar1.TabIndex = 0 + ' + 'Label1 + ' + Me.Label1.AutoSize = True + Me.Label1.Location = New System.Drawing.Point(12, 9) + Me.Label1.Name = "Label1" + Me.Label1.Size = New System.Drawing.Size(62, 13) + Me.Label1.TabIndex = 1 + Me.Label1.Text = "Updating ..." + ' + 'Form1 + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(417, 55) + Me.ControlBox = False + Me.Controls.Add(Me.Label1) + Me.Controls.Add(Me.ProgressBar1) + Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) + Me.Name = "Form1" + Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen + Me.Text = "Updater" + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + + Friend WithEvents ProgressBar1 As ProgressBar + Friend WithEvents Label1 As Label +End Class diff --git a/Pilz.Updating.Updater/UpdateInstaller.resx b/Pilz.Updating.Updater/UpdateInstaller.resx new file mode 100644 index 0000000..7c83c6d --- /dev/null +++ b/Pilz.Updating.Updater/UpdateInstaller.resx @@ -0,0 +1,643 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAkAICAQAAEABADoAgAAlgAAABAQEAABAAQAKAEAAH4DAAAwMAAAAQAIAKgOAACmBAAAICAAAAEA + CACoCAAAThMAABAQAAABAAgAaAUAAPYbAAAAAAAAAQAgAEIdAABeIQAAMDAAAAEAIACoJQAAoD4AACAg + AAABACAAqBAAAEhkAAAQEAAAAQAgAGgEAADwdAAAKAAAACAAAABAAAAAAQAEAAAAAACAAgAAAAAAAAAA + AAAQAAAAAAAAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8A + AAD/AP8A//8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAiIiIiIiIiIiIiIiIgAAACHd3d3d3d3d3d3d3d3 + gAAAh3d3d3d3d3d3d3d3d4AAAId3d3d3d3d3d3d3d3iAAACHd3d3d3d3d3d3d3d3gAAAh3d3d3d3d3d3 + d3d3d4AAAIh4eHh3h3h3h3h3h3iAAACIeHh3h4eHh4eHh4eIgAAAiHd3d4eHh4eHh4eHh4AAAIiId0Z3 + h4h4d4h4d4iAAACId3Z2d4eHiIiHiIiHgAAAiHZ2ZnZ4h4eHh4eHiIAAAIh3ZnZ2d4iIiIiIiIiAAACI + d3Z2Z3eIiIiIiIiIgAAAiIh2xneIiIiIiIiIiIAAAIh4dnZniIiIiIiIiIiAAACIiHZ8d4iIiIiIiIiI + gAAACIhnZneIiIiIiIiIiIAAAAh3dmdnh4iIeHh4eHgAAAAIh3Z8Z4iIiHh4eHiIAAAACIh2dneHiIiI + iIiIiAAAAACIdnZniIiIiIiIiIAAAAAAiHZnx3iIiIiIiIiAAAAAAAiHZ2dniIiIiIiIAAAAAAAAB2dn + ZnZ2dnZ2doAAAAAAAABnx2dnZ2dmdsaAAAAAAAAAB2dnxnxnZ2dngAAAAAAAAAB2dnZ2fGfHZoAAAAAA + AAAACHZ2dnZ2ZmeAAAAAAAAAAAAAAAAIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAP/////gAAAPwAAAB8AA + AAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB+AA + AAfgAAAP4AAAD+AAAA/wAAAf8AAAH/gAAD/+AAAf/wAAH/+AAB//wAAf/+AAH///4P//////KAAAABAA + AAAgAAAAAQAEAAAAAADAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICA + AACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAh3d3d3d3cACHd3d3d3 + dwAId3h3d3d4AAiHd4eHh3gACHdnh4d4eAAIdmd4iIiIAAh3Z3iIiIgACIdniIiIiAAId2eIh4eIAACH + d3iIiIgAAIdmiIiIgAAACHZ3d3dwAAAAdnZ2Z2AAAAAIZ2dnYAAAAAAAAAAAAP////+AA///gAP//4AD + //+AA///gAP//4AD//+AA///gAP//4AD///AA///wAf//+AH///wB///+Af///////8oAAAAMAAAAGAA + AAABAAgAAAAAAIAKAAAAAAAAAAAAAAABAAAAAAAAAAAAAJ5gLgCbYjEAnWMyAJpjNACbZDUAnGQ1AJ1n + OQChYi8Ao2MwAKJkMQClZDAAomY0AKVnNACoZjEApmg1AKpoMgCtaTMAqWk1AK5qNAClaTkApWs8AKZs + PACtbDgAqW09ALBqNACybDUAtW01ALhvNwCwbTgArnA+ALlwNwC2cDoAsnE/ALtxOAC9cjgAwHM5AMF0 + OQDEdjsAxXc8AJxqQAClbUAAs3JAALRzQQC1dkUAvXlFALJ5TQC0e08AsHpQAI1+bQCRf20Ax3tBAMh/ + RgC6hl0AvoleAJOAbgCKg3gAjIN4AI6FegCVgnAAl4RxAJmFcgCRiHwAmYx+AKCCZwCogmQAoYNoAKOE + aAClhWkAqYdqAK2JawCsiWwAsYVjALCGZADHgEoAz4xaAMCKYADJlm4AzJdvAM2YbwDSlGUAyZlyAM+Z + cADKmnQA0JlwANKddADWnnQA1aB4ANejfABokKkAapKsAGyUrQBvl7AAcZmyAHOatAB0nLYAfZ+zAHqf + tgB3nrgAeJ+5AH2gtQB5oLoAfqK4AHuivAB8o70AfaS+AH6lwACVjoQAkY+IAJyTigCNkZQAlpaSAJGU + mACVmpsAkpmdAJacnQCYn58AnJ+fAKmWhQCim5IAvaKLAImYpACPnKgAkZ6qAI+iqwCaoKAAkaKsAJOl + rQCVpq8Am6etAIGjtwCOpbIAgaS5AIWmuwCCprwAhai9AImqvgCRpbAAlKazAJaosACZqrIAn6uxAJOt + vwDbqYMA3K6LANWwkwDftpcAgKfBAIOnxACBqMIAhqnBAIOqxACEqMUAhazGAIiswgCJr8cAh6vIAIau + yACJq8gAia7KAImwygCKsswAjLHMAI20zgCbtMMAkbHKAJK0ywCTs8wAlLPNAJO0zgCUtM4Am7jNAJy5 + zgCPt9AAkLbQAJa20ACRudIAlbrSAJS81ACYudIAnbrQAJi80wCfvNEAmr3VAJ2/1ACgvdIAnMDWAJvB + 2ACgwdYAocPYAKXD2ACuyNsArczfALPL3QC1z98AuMzcALTQ4QC40uEAwdPiAMDW5QDL2eIAyd3pAP9R + xwD/cdEA/5HcAP+x5QD/0fAA////AAAAAAAsAC8ASwBQAGkAcACHAJAApQCwAMQAzwDhAPAA8BH/APIx + /wD0Uf8A9nH/APeR/wD5sf8A+9H/AP///wAAAAAAGwAvAC0AUAA/AHAAUgCQAGMAsAB2AM8AiADwAJkR + /wCmMf8AtFH/AMJx/wDPkf8A3LH/AOvR/wD///8AAAAAAAgALwAOAFAAFQBwABsAkAAhALAAJgDPACwA + 8AA+Ef8AWDH/AHFR/wCMcf8AppH/AL+x/wDa0f8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAC0rKysrKysrKysrKysq6usrKysq6urq6urq6urq6urq6urrKurq8MAAAAAAAAA + AABeWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZW6sAAAAAAAAAAABfWVlZWVlZWVlZ + WVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWqsAAAAAAAAAAABfW1tbW1tbW1tbW1tbW1tbW1tbW1tb + W1tbW1tbW1tbW1tbW1taW6wAAAAAAAAAAABfW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tb + W1tbXKwAAAAAAAAAAABiXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXawAAAAAAAAA + AABlXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXqwAAAAAAAAAAABlXl9eXl5eXl5e + X15fXl5eXl9eX19fX19fX19fX19fX15fXl9fX6wAAAAAAAAAAABnYmJiYmJiYmJfYl9iYmJiYmJfYl9i + X2JfYl9iX2JfYl9iX2JfYrQAAAAAAAAAAABnY2NjYmNjY2NjY2NjY2NjY2NjZWVlZWVlZWVlZWVlY2Nj + ZWNjZbQAAAAAAAAAAABpZWdlZ2VlZ2FlZWdlZWdlZ2VlZWVlZWVlZWVlZWVlZ2VlZWdlZbQAAAAAAAAA + AABpaGhoaGhoYDE4ZGhoaGhoaGhpaGhoaGhoaGhoaGhoaGhoaGhoaLQAAAAAAAAAAABqaWlqaWlkMgIF + OWZpaWpqaWpqampqampqampqampqampqamlpabYAAAAAAAAAAACTk5OTk4IyAwEBBTqGk5OTk5OTk5OT + k5OTk5OTk5OTk5OTk5OTk7QAAAAAAAAAAACVlZeVhDcDCAEBAQU6hpWVl5WVlZWVlZWVlZWVlZWVl5WX + l5WVlbQAAAAAAAAAAACVl5eFOwwICAgIAQEFPoeXmZeXl5eXl5eXl5eXl5eXl5eXl5eXl7YAAAAAAAAA + AACVnYc9DAgJCAgICAEIBj6amZ2dnZ2dnZ2dnZ2dnZ2dmZ2ZnZ2ZmbYAAAAAAAAAAACXiD0PCwsKCQgJ + CAgBAQY+mpudm5ubm5udm52bnZudm6CdoJ2bnbYAAAAAAAAAAACWPykVFAsLCwoJCggIBgcobJugoKGg + oKGgoaChoKGgoaChoaChn7kAAAAAAAAAAACWiX5+bxULCwsKCgkKa3x8g6Kjo6OjoaOho6GjoaOhoaGj + oaOhoLkAAAAAAAAAAACdo6OjfxYODg4LCwoMcaOjraOjo6Ojo6Ojo6Ojo6Oto6Ojo62jobkAAAAAAAAA + AACdra2tgBgSDg4LCwsMc62tra2xsbWxra2tra2wrbCtra2wrbCto7kAAAAAAAAAAACfsLCwixgQEBAO + DgsNc7CtsLrFxcXFu7CwrbCtsK2wsLCwsLCwrbkAAAAAAAAAAACfsLKyjB4SEBAQDg4PdLKwsrvExMXE + u7KysrKysrKysrCysrCyrbkAAAAAAAAAAAChsrKyjB4TEREREBISfbKysrvAwMDAu7KysrKysrKysrKy + srKysrkAAAAAAAAAAACdo62jih4TExMRERASc62to7G9vr29saOto62tra2tra6jraOuobkAAAAAAAAA + AACYampqeR4aGRkTEREXbmqTk5inqKinlJRqampqampqamqUampqarkAAAAAAAAAAAC0mJiceiEaGhoZ + GRMXcJiYmJ6or6qonpyYnJicmJyYnJicmJicmAAAAAAAAAAAAADGnJyceysbGxoaGhkXcpycnJ+qr6+q + opycnJycnJycnJycnJycpwAAAAAAAAAAAAAAqZ+ffiscHBsbGhodcZ+fn6Kzs6+vop+fn5+fn5+fn5+f + n5+fwQAAAAAAAAAAAAAAv6KiiiwcHBwbGxoabaKioqmzs7Ozo6KioqKioqKioqOioqKjAAAAAAAAAAAA + AAAAAKOuji8fHxwcHBsbQaWjo663t7e3rq6jrqOuo66jrqOuo66+AAAAAAAAAAAAAAAAAL2tpkgjIiIf + HBwcKnWusLC3t7q3sq2wrbCtsK2wra2wra0AAAAAAAAAAAAAAAAAAMewsHYkIyIiIh8cHDCBsLK8urq7 + srGwsrCysLCysLKwsLoAAAAAAAAAAAAAAAAAAAC6so0tJCQjIiIiHBwud6S8uLy8tbKxsbGxsbGxsbGx + scIAAAAAAAAAAAAAAAAAAAAAychTJSQkJCMiHx8fIC5JRkZHRUVFRERERENDQ0NCQHgAAAAAAAAAAAAA + AAAAAAAAAAAASiUlJCQjIyIfHxwcHBsbGhoaGRMTEREQEBAODjUAAAAAAAAAAAAAAAAAAAAAAAAAkicm + JSUkIyMjIh8cHBsbGxoaGhkTExEREBAQEDUAAAAAAAAAAAAAAAAAAAAAAAAAAFgmJiYlJSQkIyIiHxwc + HBsbGhoaGhMTEREREDUAAAAAAAAAAAAAAAAAAAAAAAAAAABWJyYmJSUkJCMjIh8fHBwbGxsaGhoZExMR + ETYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjzMnJiYlJSQkIyMiIh8cHBsbGhoaGRkTETYAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABLJyYmJiUkJCQjIyIiHBwcGxsaGhoZGUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAFA0JiYlJSQkIyMiHx8cHBsbGxoaGUwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJBYV1dX + VVRST09PTk5NTU1NUZEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /////wAA////////AADwAAAAAB8AAPAAAAAAHwAA8AAAAAAfAADwAAAAAB8AAPAAAAAAHwAA8AAAAAAf + AADwAAAAAB8AAPAAAAAAHwAA8AAAAAAfAADwAAAAAB8AAPAAAAAAHwAA8AAAAAAfAADwAAAAAB8AAPAA + AAAAHwAA8AAAAAAfAADwAAAAAB8AAPAAAAAAHwAA8AAAAAAfAADwAAAAAB8AAPAAAAAAHwAA8AAAAAAf + AADwAAAAAB8AAPAAAAAAHwAA8AAAAAAfAADwAAAAAB8AAPAAAAAAHwAA8AAAAAAfAADwAAAAAD8AAPAA + AAAAPwAA+AAAAAA/AAD4AAAAAH8AAPwAAAAAfwAA/AAAAAD/AAD8AAAAAP8AAP4AAAAA/wAA/wAAAAD/ + AAD/4AAAAP8AAP/gAAAA/wAA//AAAAD/AAD/+AAAAP8AAP/8AAAA/wAA//8AAAD/AAD//8AAAP8AAP// + +AAA/wAA////////AAD///////8AACgAAAAgAAAAQAAAAAEACAAAAAAAgAQAAAAAAAAAAAAAAAEAAAAA + AAAAAAAAnmEuAJtjNACcYzUAnWQ1AJtoPgCdaj8AoWIvAKNjMACjZDAApWQwAKhmMQCqaDIArWkzAK9q + NACkajsApWs8AKZtPQCpbj4AsGs0ALJsNQC1bTUAuG83AK1wPwC5cDcAtnA6ALZxPAC6cTgAvXI4AL91 + PADAczkAwXQ6AMR2OwDFdzwAl2pDAJtrQgCgbEAAqW9AAK1xQAChdE4AsnJBALRzQQC0dkYArXpTALR8 + UADGe0IAyX9IAJmCbACLgnYAjoV5AJGHfACZhngAmYl6AJyLfQCdjX0Aq4hrALCJagCiiHMApY98AMiA + SgDOi1gAzoxZAM6SZABpkasAa5OtAGyUrQB/l6MAbpawAHCYsQBzm7QAdJy1AHuftQB3n7gAeqG6AH6i + uAB8pL0Af6fBAIeOjgCRkIoAipCQAI2TkgCQlZUAlZqaALCnnQCPm6EAjJ2rAJChrwCPo7AAj6WxAI6o + tgCBpbsAgKe/AISovgCNqboAkaaxAJKmtQCTqLMAlqq1AJirtQCZrLYAkq2/AJituACfr7gAo6alAKOw + twCjsrkAzaiLANCqjADNrJEA37OSANq1mQDct5oAg6fEAICowQCHq8EAg6vEAISpxACFrcYAia/HAIat + yACIrcoAjK3JAJOuwQCJsMoAjLLKAIuxzACPscwAjrbPAJS0ygCRtc4AlbXOAJm3zwCOtdAAk7fQAJa3 + 0ACRuNIAlbnSAJO71ACZudEAmbzUAJ2+1ACdwNcAosTaAKTF2gCtyt0AuMzaALrO3AC80N4AsM3gALbR + 4QC90eAA8GkAAP95EQD/ijEA/51RAP+vcQD/wZEA/9KxAP/l0QD///8AAAAAAC8DAABQBAAAcAYAAJAJ + AACwCgAAzwwAAPAOAAD/IBIA/z4xAP9cUQD/enEA/5eRAP+2sQD/1NEA////AAAAAAAvAA4AUAAXAHAA + IQCQACsAsAA2AM8AQADwAEkA/xFaAP8xcAD/UYYA/3GcAP+RsgD/scgA/9HfAP///wAAAAAALwAgAFAA + NgBwAEwAkABiALAAeADPAI4A8ACkAP8RswD/Mb4A/1HHAP9x0QD/kdwA/7HlAP/R8AD///8AAAAAACwA + LwBLAFAAaQBwAIcAkAClALAAxADPAOEA8ADwEf8A8jH/APRR/wD2cf8A95H/APmx/wD70f8A////AAAA + AAAbAC8ALQBQAD8AcABSAJAAYwCwAHYAzwCIAPAAmRH/AKYx/wC0Uf8AwnH/AM+R/wDcsf8A69H/AP// + /wAAAAAACAAvAA4AUAAVAHAAGwCQACEAsAAmAM8ALADwAD4R/wBYMf8AcVH/AIxx/wCmkf8Av7H/ANrR + /wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACRkZGRkZGRkZGRkZGRkZGRkZGR + kZGRkZGRAAAAAAAAkUE/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/P0CRAAAAAACSQT8/P0A/QD8/Pz9APz8/ + Pz8/Pz8/Pz9AQZEAAAAAAJFDQUNBQ0FDQ0NBQ0NDQ0NDQ0NDQ0NDQUNDkgAAAAAAkUVERERERERERERE + REREREREREREREREREWSAAAAAACSRkVGRUVFRkZFRUVGRkZGRkZGRkVGRUZGRpIAAAAAAJJISEhISEhI + SEhISEhISEhISEhISEhISEhIkgAAAAAAkktLSUlJQkdLSUtJS0lLSUlJS0lLSUtJS0mSAAAAAACTS0tL + S00iMEpLW0tLTEtMS0xLW0tMS0xLS5MAAAAAAJNMcVtPBQECMVpxcXFxcXFxcXFxcXFxcXFMkgAAAAAA + k3NzUAYHAQEDMlxzc3N1c3N1c3Nzc3Nzc3OTAAAAAACTc1EkCAkHBwcEMnJ3dXZ1dnV2dXZ1dnZ3dZMA + AAAAAJNUJxAKCQgJBwQjTnZ7e3t7e317e317e3t2lgAAAAAAk11eUhAKCgkJL1hZfH99fX1/fX1/fX1/ + fH2WAAAAAACWfX9gJQsLCgk0f4SHiIiHf39/f39/f39/fZYAAAAAAJZ/h2ElDAwLCjaHiY+VlY+Hh4eH + h4eHh4mElgAAAAAAloeJZSYODAwMNomJj5SUj4mJiYmJiYmJiYeWAAAAAAAAeHtXJg4NDQ00e3uFjIyF + e3t7e3t7e3t7d5MAAAAAAAB0cFUmFBMODTNwcHmCgnlwcHBwcHBwcHB0AAAAAAAAAIp4VigVFRQTNXh4 + foaGfnh4eXh4eHh4eIMAAAAAAAAAln1fKhYVFRU5fH2BioiFfX19fX19fX19lgAAAAAAAAAAiHosGxgW + FSt6hIiLi4iEhISEhISEhIgAAAAAAAAAAACQhTgcGxgWGTqAi42Ni4mIh4mHiIeIkAAAAAAAAAAAAACO + Ux0eHBsYGjdnaGlmY2NjY2NiYmEAAAAAAAAAAAAAAAAAPh8eHBwbGBopKSgmFxcXEhIREWwAAAAAAAAA + AAAAAAAAOyAfHhwcGxYWFRUUFA4NDQwMagAAAAAAAAAAAAAAAAAALiAfHx4cGxsWFRUUFBQODQ1rAAAA + AAAAAAAAAAAAAAAAPCEgHx4eHBsYFhUVFBMTDWsAAAAAAAAAAAAAAAAAAAAAbT0tHx8eHBwbGBYVFRQT + awAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG9vbm5uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP/////gAAAPwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AA + AAfAAAAHwAAAB8AAAAfAAAAHwAAAB+AAAAfgAAAP4AAAD+AAAA/wAAAf8AAAH/gAAD/+AAAf/wAAH/+A + AB//wAAf/+AAH///4P//////KAAAABAAAAAgAAAAAQAIAAAAAABAAQAAAAAAAAAAAAAAAQAAAAAAAAAA + AACcZDUAnWc5AKFiLwCjZTIApWUwAKlnMgCuajMArGs2AKVtPwCxazQAtW01ALlwNwC1cDoAs3I+ALpx + OQC+cjkAu3M8AL52PgDAdDkAl3RWAJ52VACpcUMArXJDALF1RQC0ek0AontbAKd8WwChfF0AtH5UAJp/ + ZwDCeUEAjoR4AKyOdQChjXoApI57AKmSfQDJg08A0ZZpAG6VrQBvl7AAc5qyAHSasgB1nbYAeZ+4AHyg + tgB7o7wAfqW9AIaKiACQj4oAgJmoAIafrQCUoKQAmaSqAI2isgCCprwAkaa1AJCptgCVrboAy6iMANur + hgCBqcIAh67GAIiqwwCMq8QAhq3IAImuyQCNtM0AkrbOAJW2zwCZtskAnLnMAJ+8zwCQttAAkbjRAJi7 + 0gCYvNQAornJAKi7yACiv9IAoL3UAKnC0QCnx9sAqsfaAK3H2QAKsAAAC88AAA7wAAAg/xIAPf8xAFv/ + UQB5/3EAmP+RALX/sQDU/9EA////AAAAAAAULwAAIlAAADBwAAA9kAAATLAAAFnPAABn8AAAeP8RAIr/ + MQCc/1EArv9xAMD/kQDS/7EA5P/RAP///wAAAAAAJi8AAEBQAABacAAAdJAAAI6wAACpzwAAwvAAANH/ + EQDY/zEA3v9RAOP/cQDp/5EA7/+xAPb/0QD///8AAAAAAC8mAABQQQAAcFsAAJB0AACwjgAAz6kAAPDD + AAD/0hEA/9gxAP/dUQD/5HEA/+qRAP/wsQD/9tEA////AAAAAAAvFAAAUCIAAHAwAACQPgAAsE0AAM9b + AADwaQAA/3kRAP+KMQD/nVEA/69xAP/BkQD/0rEA/+XRAP///wAAAAAALwMAAFAEAABwBgAAkAkAALAK + AADPDAAA8A4AAP8gEgD/PjEA/1xRAP96cQD/l5EA/7axAP/U0QD///8AAAAAAC8ADgBQABcAcAAhAJAA + KwCwADYAzwBAAPAASQD/EVoA/zFwAP9RhgD/cZwA/5GyAP+xyAD/0d8A////AAAAAAAvACAAUAA2AHAA + TACQAGIAsAB4AM8AjgDwAKQA/xGzAP8xvgD/UccA/3HRAP+R3AD/seUA/9HwAP///wAAAAAALAAvAEsA + UABpAHAAhwCQAKUAsADEAM8A4QDwAPAR/wDyMf8A9FH/APZx/wD3kf8A+bH/APvR/wD///8AAAAAABsA + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAH9//wJ/n78If5+/CH+fvwh/n78If5+/CH+fvwh/n78If5+/CH+fvwh/n78I + f5+/CH+fvwh/n78If5+/CH+fvwh/n78If5+/CH+fvwh/n78If5+/CH+fvwh/n78If5+/CH+fvwh/n78I + f5+/CH+fvwh/n78If5+/CH+fvwh/n78If5+/CH+fvwh/n78If5+/CH+fvwh/n78If5+/CH+qqgYAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHWcujR1nbuydZ26t3Wdurd1nbq3dZ26t3Wdurd1nbq3 + dZ26t3Wdurd1nbq3dZ26t3Wdurd1nbq3dZ26t3Wdurd1nbq3dZ26t3Wdurd1nbq3dZ26t3Wdurd1nbq3 + dZ26t3Wdurd1nbq3dZ26t3Wdurd1nbq3dZ26t3Wdurd1nbq3dZ26t3Wdurd1nbq3dZ26t3Wdurd1nbq3 + dZ26t3eevYR/qqoGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHifu0hvl7P3aJCq/2iQqv9okKr/ + aJCq/2iQqv9okKr/aJCq/2iQqv9okKr/aJCq/2iQqv9okKr/aJCq/2iQqv9okKr/aJCq/2iQqv9okKr/ + aJCq/2iQqv9okKr/aJCq/2iQqv9okKr/aJCq/2iQqv9okKr/aJCq/2iQqv9okKr/aJCq/2iQqv9okKr/ + aJCq/2iQqv9okKr/apKt/3Wdurd/n78IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHifu0hvl7P3 + aJCp/2iQqf9okKn/aJCp/2iQqf9okKn/aJCp/2iQqf9okKn/aJCp/2iQqf9okKn/aJCp/2iQqf9okKn/ + aJCp/2iQqf9okKn/aJCp/2iQqf9okKn/aJCp/2iQqf9okKn/aJCp/2iQqf9okKn/aJCp/2iQqf9okKn/ + aJCp/2iQqf9okKn/aJCp/2iQqf9okKn/apKs/3Wdurd/n78IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAHifu0hxmbT3a5Os/2uTrP9rk6z/a5Os/2uTrP9rk6z/a5Os/2uTrP9rk6z/a5Os/2uTrP9rk6z/ + a5Os/2uTrP9rk6z/a5Os/2uTrP9rk6z/a5Os/2uTrP9rk6z/a5Os/2uTrP9rk6z/a5Os/2uTrP9rk6z/ + a5Os/2uTrP9rk6z/a5Os/2uTrP9rk6z/a5Os/2uTrP9rk6z/bZWu/3adurd/n78IAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAHifu0hxmbX3bJSt/2yUrf9slK3/bJSt/2yUrf9slK3/bJSt/2yUrf9slK3/ + bJSt/2yUrf9slK3/bJSt/2yUrf9slK3/bJSt/2yUrf9slK3/bJSt/2yUrf9slK3/bJSt/2yUrf9slK3/ + bJSt/2yUrf9slK3/bJSt/2yUrf9slK3/bJSt/2yUrf9slK3/bJSt/2yUrf9slK3/bpav/3aeurd/n78I + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHifu0hzm7b3b5ew/2+XsP9vl7D/b5ew/2+XsP9vl7D/ + b5ew/2+XsP9vl7D/b5ew/2+XsP9vl7D/b5ew/2+XsP9vl7D/b5ew/2+XsP9vl7D/b5ew/2+XsP9vl7D/ + b5ew/2+XsP9vl7D/b5ew/2+XsP9vl7D/b5ew/2+XsP9vl7D/b5ew/2+XsP9vl7D/b5ew/2+XsP9vl7D/ + cJiy/3aevLd/n78IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHifu0h0nLf3cZmy/3GZsv9xmbL/ + cZmy/3GZsv9xmbL/cZmy/3GZsv9xmbL/cZmy/3GZsv9xmbL/cZmy/3GZsv9xmbL/cZmy/3GZsv9xmbL/ + cZmy/3GZsv9xmbL/cZmy/3GZsv9xmbL/cZmy/3GZsv9xmbL/cZmy/3GZsv9xmbL/cZmy/3GZsv9xmbL/ + cZmy/3GZsv9xmbL/cpqz/3aevLd/n78IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHifu0h1nbj3 + c5u0/3ObtP9zm7T/c5u0/3ObtP9zm7T/c5u0/3ObtP9zm7T/c5u0/3ObtP9zm7T/c5u0/3ObtP9zm7T/ + c5u0/3ObtP9zm7T/c5u0/3ObtP9zm7T/c5u0/3ObtP9zm7T/c5u0/3ObtP9zm7T/c5u0/3ObtP9zm7T/ + c5u0/3ObtP9zm7T/c5u0/3ObtP9zm7T/dJy1/3eevLd/n78IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAHifu0h2nrn3dZ22/3Wdtv91nbb/dZ22/3Wdtv91nbb/dZ22/3Wdtv91nbb/dZ22/3Wdtv91nbb/ + dZ22/3Wdtv91nbb/dZ22/3Wdtv91nbb/dZ22/3Wdtv91nbb/dZ22/3Wdtv91nbb/dZ22/3Wdtv91nbb/ + dZ22/3Wdtv91nbb/dZ22/3Wdtv91nbb/dZ22/3Wdtv91nbb/dZ23/3egvbd/n78IAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAHifu0h3oLr3d5+4/3efuP93n7j/d5+4/3efuP93n7j/d5+4/3efuP93n7j/ + d5+4/3efuP93n7j/d5+4/3efuP93n7j/d5+4/3efuP93n7j/d5+4/3efuP93n7j/d5+4/3efuP93n7j/ + d5+4/3efuP93n7j/d5+4/3efuP93n7j/d5+4/3efuP93n7j/d5+4/3efuP93n7j/d5+5/3egvbd/n78I + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHifu0h4obv3eaG6/3mhuv95obr/eaG6/3mhuv95obr/ + eaG6/3qftv96n7f/eaG6/3mhuv95obr/eaG6/3mhuv95obr/eaG6/3mhuv95obr/eaG6/3mhuv95obr/ + eaG6/3mhuv95obr/eaG6/3mhuv95obr/eaG6/3mhuv95obr/eaG6/3mhuv95obr/eaG6/3mhuv95obr/ + eaG7/3egvbd/n78IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHifu0h5orz3e6O8/3ujvP97o7z/ + e6O8/3ujvP97o7z/fZ+z/4x+b/+Kg3j/fKC2/3ujvP97o7z/e6O8/3ujvP97o7z/e6O8/3ujvP97o7z/ + e6O8/3ujvP97o7z/e6O8/3ujvP97o7z/e6O8/3ujvP97o7z/e6O8/3ujvP97o7z/e6O8/3ujvP97o7z/ + e6O8/3ujvP97o7z/e6O8/3mgvbd/n78IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHifu0h6o733 + faW+/32lvv99pb7/faW+/32lvv9/obX/j35s/5tiMf+aYzT/jIN4/36iuP99pb7/faW+/32lvv99pb7/ + faW+/32lvv99pb7/faW+/32lvv99pb7/faW+/32lvv99pb7/faW+/32lvv99pb7/faW+/32lvv99pb7/ + faW+/32lvv99pb7/faW+/32lvv99pb7/fKS+/3mhvrd/n78IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAHifu0h7pL73f6fA/3+nwP9/p8D/f6fA/4Gjt/+Rf23/nWMy/51gLv+cYC3/m2M0/42Eef+ApLr/ + f6fA/3+nwP9/p8D/f6fA/3+nwP9/p8D/f6fA/3+nwP9/p8D/f6fA/3+nwP9/p8D/f6fA/3+nwP9/p8D/ + f6fA/3+nwP9/p8D/f6fA/3+nwP9/p8D/f6fA/3+nwP9/p8D/fqbA/3mhvrd/n78IAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAHifu0h8pcD3ganC/4Gpwv+BqcL/g6W5/5OAbv+eYzP/n2Eu/55hLv+eYC7/ + nWAu/5tkNf+Ohnr/gqa8/4Gpwv+BqcL/ganC/4Gpwv+BqcL/ganC/4Gpwv+BqcL/ganC/4Gpwv+BqcL/ + ganC/4Gpwv+BqcL/ganC/4Gpwv+BqcL/ganC/4Gpwv+BqcL/ganC/4Gpwv+BqcL/gKjC/3mhvrd/n78I + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHifu0h9psH3g6vE/4OrxP+Fprv/lYJw/6BlM/+hYi// + oGIv/59hLv+fYS7/nmEu/51gLv+cZDX/j4d7/4Sovv+Dq8T/g6vE/4OrxP+Dq8T/g6vE/4OrxP+Dq8T/ + g6vE/4OrxP+Dq8T/g6vE/4OrxP+Dq8T/g6vE/4OrxP+Dq8T/g6vE/4OrxP+Dq8T/g6vE/4OrxP+Dq8T/ + gqrD/3qhvrd/n78IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHifu0h+p8L3ha3G/4epvP+XhHH/ + omY0/6JjL/+iYy//oWIv/6BiL/+gYi//n2Eu/55hLv+eYS7/nGQ1/5GIfP+GqsD/ha3G/4Wtxv+Frcb/ + ha3G/4Wtxv+Frcb/ha3G/4Wtxv+Frcb/ha3G/4Wtxv+Frcb/ha3G/4Wtxv+Frcb/ha3G/4Wtxv+Frcb/ + ha3G/4Wtxv+Frcb/hKzF/3qjwLd/n78IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHifu0iAqMP3 + iaq+/5mFcv+lZzX/pWQw/6RkMP+jZDD/omMv/6JjL/+hYi//oGIv/59iL/+fYS7/nmEu/5xkNf+SiX3/ + iKzC/4evyP+Hr8j/h6/I/4evyP+Hr8j/h6/I/4evyP+Hr8j/h6/I/4evyP+Hr8j/h6/I/4evyP+Hr8j/ + h6/I/4evyP+Hr8j/h6/I/4evyP+Hr8j/ha3H/3qjwLd/n78IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAHifu0iCpr33mYx+/6VtQP+lazz/pWk5/6VlMf+lZDD/pGQw/6NjMP+iYy//oWMv/6FiL/+gYi// + nmU1/51nOf+cakD/kY+I/4mvx/+Jscr/ibHK/4mxyv+Jscr/ibHK/4mxyv+Jscr/ibHK/4mxyv+Jscr/ + ibHK/4mxyv+Jscr/ibHK/4mxyv+Jscr/ibHK/4mxyv+Jscr/h6/J/3qjwLd/n78IAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAHifu0iDp8H3kaWw/5GjrP+Ro6z/lpaS/6VqOv+mZTH/pWUw/6RkMP+jZDD/ + o2Mw/6JjL/+hZDL/lY6E/4+iq/+Poqv/jqWy/4uxyf+Ls8z/i7PM/4uzzP+Ls8z/i7PM/4uzzP+Ls8z/ + i7PM/4uzzP+Ls8z/i7PM/4uzzP+Ls8z/i7PM/4uzzP+Ls8z/i7PM/4uzzP+Ls8z/ibHK/3yjwLd/n78I + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHifu0iDq8b3jbXO/421zv+Ntc7/k6Wt/6ZsPP+nZjH/ + p2Ux/6ZlMf+lZTD/pGQw/6NkMP+iZTP/lJub/421zv+Ntc7/jbXO/421zv+Ntc7/jbXO/421zv+Ntc7/ + jbXO/421zv+Ntc7/jbXO/421zv+Ntc7/jbXO/421zv+Ntc7/jbXO/421zv+Ntc7/jbXO/421zv+Ntc7/ + irLM/3ykwbd/n78IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHifu0iErMf3j7fQ/4+30P+Pt9D/ + laav/6htPf+pZzL/qGYx/6dmMf+mZTH/pWUw/6VkMP+jZjT/lZyc/4+30P+Pt9D/j7fQ/5C40P+Vu9L/ + lbvS/5W70v+Vu9L/kLjQ/4+30P+Pt9D/j7fQ/4+30P+Pt9D/j7fQ/4+30P+Pt9D/j7fQ/4+30P+Pt9D/ + j7fQ/4+30P+Pt9D/jLTO/3ykwbd/n78IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHifu0iErMj3 + kLjR/5C40f+QuNH/lqiw/6ltPf+raDL/qmcy/6lnMv+oZjH/p2Yx/6ZlMf+lZzT/l52e/5C40f+QuNH/ + kLjR/5zA1v+40uH/udLi/7nS4v+40uH/nMDW/5C40f+QuNH/kLjR/5C40f+QuNH/kLjR/5C40f+QuNH/ + kLjR/5C40f+QuNH/kLjR/5C40f+QuNH/jbXP/3ykwbd/n78IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAHifu0iFrcn3krrT/5K60/+SutP/mKmy/6tuPv+saTP/q2gy/6poMv+pZzL/qGcy/6hmMf+maDX/ + mJ+f/5K60/+SutP/krrT/5zA1/+00OH/tdHh/7XR4f+00OH/nMDX/5K60/+SutP/krrT/5K60/+SutP/ + krrT/5K60/+SutP/krrT/5K60/+SutP/krrT/5K60/+SutP/j7fQ/32kwbd/n78IAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAHifu0iGrsr3lLzV/5S81f+UvNX/mquz/61wP/+uajP/rWkz/6xoM/+raDL/ + qmcy/6lnMv+oaDX/mqCg/5S81f+UvNX/lLzV/5vB2P+tzN//rszf/67M3/+tzN//m8HY/5S81f+UvNX/ + lLzV/5S81f+UvNX/lLzV/5S81f+UvNX/lLzV/5S81f+UvNX/lLzV/5S81f+UvNX/kbnS/32lwbd/n78I + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHifu0iDq8f3jbXP/421z/+Ntc//laav/65wP/+vajT/ + rmoz/65pM/+taTP/rGgz/6toMv+paTb/lpyd/421z/+Ntc//jbXP/5O50v+hw9j/osPY/6LD2P+hw9j/ + k7nS/421z/+Ntc//jbXP/421z/+Ntc//jbXP/421z/+Ntc//jbXP/421z/+Ntc//jbXP/421z/+Ntc// + irLN/3ykwbd/n78IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHufv0B9o8HyfqTC/36kwv9+pML/ + iZik/69wPv+xazT/sGs0/69qNP+uajP/rWkz/6xpM/+qajb/jZGU/36kwv9+pML/fqTC/4SoxP+Sssv/ + lLTN/5OzzP+Rssv/hKjE/36kwv9+pML/fqTC/36kwv9+pML/fqTC/36kwv9+pML/fqTC/36kwv9+pML/ + fqTC/36kwv9+pML/fqTC/3yjwbKRttoHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH+qyRiEqMXM + hajG/4Woxv+FqMb/j5yo/7FxP/+zbDX/smw1/7FrNP+wazT/r2o0/65qM/+sazf/kZSY/4Woxv+FqMb/ + hajG/4mryP+Vs83/l7bQ/5W0zv+Us83/iavI/4Woxv+FqMb/hajG/4Woxv+FqMb/hajG/4Woxv+FqMb/ + hajG/4Woxv+FqMb/hajG/4Woxv+FqMb/hKfF/IOnw3T///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAH9//wKHqsiCh6vI/YeryP+Hq8j/kZ6q/7NyQP+1bTb/tG01/7NsNf+ybDX/sWs0/7BqNP+tbDj/ + kpmd/4eryP+Hq8j/h6vI/4uuyv+Vtc7/l7fQ/5W1z/+Vtc7/i67K/4eryP+Hq8j/h6vI/4eryP+Hq8j/ + h6vI/4eryP+Hq8j/h6vI/4eryP+Hq8j/h6vI/4eryP+Hq8j/hqrH4oirySsAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAACIrss2ia7K6Ymuyv+Jrsr/k6Gs/7RzQf+3bjb/tm42/7VtNv+0bTX/ + s2w1/7JrNf+wbTj/lpmb/4muyv+Jrsr/ia7K/42xzP+Wt9D/l7jR/5a30P+Wt9D/jbHM/4muyv+Jrsr/ + ia7K/4muyv+Jrsr/ia7K/4muyv+Jrsr/ia7K/4muyv+Jrsr/ia7K/4muyv+Jrsr/iK7LopG22gcAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLudALi7HMsYyxzf+Msc3/lKaz/7V2Rf+5bzf/ + t282/7ZuNv+1bjb/tG01/7NsNf+ybDb/nJOK/4yxzP+Msc3/jLHN/4+zzv+YudL/mbrT/5i50v+YudL/ + j7PO/4yxzf+Msc3/jLHN/4yxzf+Msc3/jLHN/4yxzf+Msc3/jLHN/4yxzf+Msc3/jLHN/4yxzf+LsMv1 + jLLMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj7HPYI2zzvmOtM// + k62//7R7T/+6cDf/uXA3/7hvN/+3bzb/tm42/7VtNv+0bTX/qIJk/5CxyP+OtM//jrTP/5G20P+avNT/ + mbvT/5q81P+avNT/kbbQ/460z/+OtM//jrTP/460z/+OtM//jrTP/460z/+OtM//jrTP/460z/+OtM// + jrTP/460z/+OtM/KkLHHFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + j7fPIJC20NeQt9H/krTL/7GFY/+8cjj/u3E4/7pwN/+5cDf/uG83/7dvNv+2bjb/s3I//5yfn/+QttD/ + kLfR/5O50v+bvtb/mr3V/5u+1v+bvtb/k7nS/5C30f+Qt9H/kLfR/5C30f+Qt9H/kLfR/5C30f+Qt9H/ + kLfR/5C30f+Qt9H/kLfR/5C20P2PttB+f39/AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAf7+/BJK505KSudP+k7nT/6mWhf++czr/vXI4/7xxOP+7cTj/unA3/7lwN/+4bzf/ + t242/7B6UP+bp63/k7nS/5W81P+dwdf/m7/W/53B1/+dwdf/lbzU/5K60/+SutP/krrT/5K60/+SutP/ + krrT/5K60/+SutP/krrT/5K60/+SutP/krrT/5G50ueTvNYyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJK91EKUu9XvlLzV/5+rsf+9eUX/v3M5/75yOf+9cjj/ + vHE4/7txOP+6cDf/uG83/7dvN/+yeUz/opuS/5u0w/+gv9P/nb/U/5/B1v+gwdb/mLzT/5W60/+VutP/ + lbrS/5W60v+VutL/lbrS/5W60v+VutL/lbrS/5W60v+VutL/lbrS/5S60a6ZsswKAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJzE1w2WvNZrlb3VgJq1x4G8fk3G + wXQ6/8B0Of+/czn/vnI5/71yOP+8cTj/unA3/7lwN/+4bzf/tnA6/7J6Tv+whmT/rYlr/62JbP+siWz/ + qYdq/6eGav+nhmr/poVp/6WFaf+lhWn/pIRo/6SEaP+jhGj/ooNo/6KDaP+hg2j/oIJn/6B5WLCiXC4L + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAADDdDxEw3U66sJ1Ov/BdDr/wHM5/79zOf+9cjn/vHE4/7txOP+6cDf/uXA3/7hvN/+3bzb/ + tm42/7VtNv+0bTX/s2w1/7JsNf+xazT/sGo0/69qNP+uaTP/rWkz/6xoM/+raDL/qmcy/6lnMv+oZjH/ + p2Yx/6ZlMMevXy8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAC2bUgHxHU6hsN1OvrDdTr/wnQ6/8B0Of+/czn/vnI5/71yOP+8cTj/ + u3E4/7pwN/+5bzf/t282/7ZuNv+1bjb/tG01/7NsNf+ybDX/sWs0/7BrNP+vajT/rmoz/61pM/+saTP/ + q2gy/6poMv+qZzL/qWcy/6dmMMevXy8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxXM5FsV2O6zEdTr9xHY7/8N1Ov/BdDr/ + wHQ5/79zOf++czn/vXI4/7xxOP+7cTj/uXA3/7hvN/+3bzf/tm42/7VuNv+0bTX/s2w1/7JsNf+xazT/ + sGs0/69qNP+uajP/rWkz/6xpM/+raDL/qmgy/6lmMcevby8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMN4PCLGdju0 + xXY6/MV2O//Ddjv/wnU6/8F0Ov/AdDn/v3M5/75yOf+9cjj/u3E4/7pwN/+5cDf/uG83/7dvNv+2bjb/ + tW02/7RtNf+zbDX/smw1/7FrNP+wazT/r2o0/65pM/+taTP/rGgz/6tnMcevby8QAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAADFczkfx3c6oMV3O/bFdzv/xHY7/8N1Ov/CdTr/wXQ6/8BzOf++czn/vXI4/7xxOP+7cTj/ + unA3/7lwN/+4bzf/t242/7ZuNv+1bTb/s201/7JsNf+xbDX/sGs0/69qNP+uajT/rWkz/6xpM8evby8Q + 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 + AAAAAHObuYBslK3/apKr/2qSq/9qkqv/apKr/2qSq/9qkqv/apKr/2qSq/9qkqv/apKr/2qSq/9qkqv/ + apKr/2qSq/9qkqv/apKr/2qSq/9qkqv/apKr/2qSq/9qkqv/apKr/2qSq/9slK3/c5u5gAAAAAAAAAAA + AAAAAAAAAAAAAAAAdZ25gG6WsP9tla7/bZWu/22Vrv9tla7/bZWu/22Vrv9tla7/bZWu/22Vrv9tla7/ + bZWu/22Vrv9tla7/bZWu/22Vrv9tla7/bZWu/22Vrv9tla7/bZWu/22Vrv9tla7/bZWu/26WsP91nbmA + AAAAAAAAAAAAAAAAAAAAAAAAAAB1nbmAcZmz/3CYsf9wmLH/cJix/3CYsf9wmLH/cJix/3CYsf9wmLH/ + cJix/3CYsf9wmLH/cJix/3CYsf9wmLH/cJix/3CYsf9wmLH/cJix/3CYsf9wmLH/cJix/3CYsf9wmLH/ + cZmz/3WduYAAAAAAAAAAAAAAAAAAAAAAAAAAAHefu4B0nLX/c5u0/3ObtP9zm7T/c5u0/3ObtP9zm7T/ + c5u0/3ObtP9zm7T/c5u0/3ObtP9zm7T/c5u0/3ObtP9zm7T/c5u0/3ObtP9zm7T/c5u0/3ObtP9zm7T/ + c5u0/3ObtP90nLX/d5+7gAAAAAAAAAAAAAAAAAAAAAAAAAAAd5+7gHefuf93n7j/d5+4/3efuP93n7j/ + d5+4/3efuP93n7j/d5+4/3efuP93n7j/d5+4/3efuP93n7j/d5+4/3efuP93n7j/d5+4/3efuP93n7j/ + d5+4/3efuP93n7j/d5+4/3efuf93n7uAAAAAAAAAAAAAAAAAAAAAAAAAAAB3n72AeqK7/3qiu/96orv/ + eqK7/3qhuf9/l6P/e5+1/3qiu/96orv/eqK7/3qiu/96orv/eqK7/3qiu/96orv/eqK7/3qiu/96orv/ + eqK7/3qiu/96orv/eqK7/3qiu/96orv/eqK7/3efvYAAAAAAAAAAAAAAAAAAAAAAAAAAAHmhvYB8pL7/ + faW+/32lvv99pLz/h46O/5dqQ/+Lgnb/fqK4/32lvv99pb7/faW+/32lvv99pb7/faW+/32lvv99pb7/ + faW+/32lvv99pb7/faW+/32lvv99pb7/faW+/32lvv98pL7/eaG9gAAAAAAAAAAAAAAAAAAAAAAAAAAA + eaG9gH+nwf+AqMH/gKe//4qQkP+baD7/nWAu/5tjNP+NhHj/gaW7/4Cowf+AqMH/gKjB/4Cowf+AqMH/ + gKjB/4Cowf+AqMH/gKjB/4Cowf+AqMH/gKjB/4Cowf+AqMH/gKjB/3+nwf95ob2AAAAAAAAAAAAAAAAA + AAAAAAAAAAB5ob+AgqrD/4Oqwv+Nk5L/nWo//6BiL/+fYS7/nmEu/5xjNf+Phnr/hKi+/4OrxP+Dq8T/ + g6vE/4OrxP+Dq8T/g6vE/4OrxP+Dq8T/g6vE/4OrxP+Dq8T/g6vE/4OrxP+Dq8T/gqrD/3mhv4AAAAAA + AAAAAAAAAAAAAAAAAAAAAHujv4CEq8T/kJWV/6BsQP+jYzD/omMv/6FiL/+fYi//n2Eu/51kNf+Rh3z/ + h6vB/4aux/+Grsf/hq7H/4aux/+Grsf/hq7H/4aux/+Grsf/hq7H/4aux/+Grsf/hq7H/4aux/+ErMb/ + e6O/gAAAAAAAAAAAAAAAAAAAAAAAAAAAe6O/gI+bof+hdE7/pGo7/6VlMf+kZDD/o2Mw/6FjL/+gYi// + nmU1/5trQv+RkIr/ia/H/4mxyv+Jscr/ibHK/4mxyv+Jscr/ibHK/4mxyv+Jscr/ibHK/4mxyv+Jscr/ + ibHK/4evyP97o8GAAAAAAAAAAAAAAAAAAAAAAAAAAAB9o7+Ajam6/5Gmsf+Vmpr/pWs8/6ZlMf+lZDD/ + o2Qw/6JjL/+Zgmz/j6Wx/46otv+Mssr/i7PM/4uzzP+Ls8z/i7PM/4uzzP+Ls8z/i7PM/4uzzP+Ls8z/ + i7PM/4uzzP+Ls8z/ibHL/32lwYAAAAAAAAAAAAAAAAAAAAAAAAAAAH2lwYCLs83/jrbP/5Oos/+nbj// + qGYx/6dlMf+lZTH/pGQw/5mKe/+Ots//jrbP/5G40f+VutL/lbrS/5G40f+Ots//jrbP/462z/+Ots// + jrbP/462z/+Ots//jrbP/462z/+Ls83/faXBgAAAAAAAAAAAAAAAAAAAAAAAAAAAfaXDgI620P+RudL/ + lqu2/6lvQP+qaDL/qWcy/6hmMf+mZTH/nI18/5G50v+RudL/pMXa/7bR4f+20eH/pMXa/5G50v+RudL/ + kbnS/5G50v+RudL/kbnS/5G50v+RudL/kbnS/4620P99pcOAAAAAAAAAAAAAAAAAAAAAAAAAAAB/p8OA + kLjR/5O71P+Yrbj/rHFB/61pM/+raDL/qmcy/6lnMv+ejn7/k7vU/5O71P+ixdr/sM3g/7DN4P+ixdr/ + k7vU/5O71P+Tu9T/k7vU/5O71P+Tu9T/k7vU/5O71P+Tu9T/kLjR/3+nw4AAAAAAAAAAAAAAAAAAAAAA + AAAAAHyiwH+Grcn/iK/L/4+jsP+tcUH/r2o0/65pM/+saTP/q2gy/5qJev+Ir8v/iK/L/5O30P+evtT/ + nb7U/5O30P+Ir8v/iK/L/4ivy/+Ir8v/iK/L/4ivy/+Ir8v/iK/L/4ivy/+Grcn/faPBgAAAAAAAAAAA + AAAAAAAAAAAAAAAAgqXCWIKmxPiDp8T/jJ2r/69xQf+ybDX/sGs0/69qNP+taTP/mYZ4/4OnxP+Dp8T/ + jK3J/5W1zv+VtM3/jK3J/4OnxP+Dp8T/g6fE/4OnxP+Dp8T/g6fE/4OnxP+Dp8T/g6fE/4OmxPmCpcNe + AAAAAAAAAAAAAAAAAAAAAAAAAACDp8Edh6zI1Iisyf+Qoa//snNC/7VtNv+zbDX/sms1/7BrNP+ci33/ + iKzJ/4isyf+Pscz/lrfQ/5W2z/+Pscz/iKzJ/4isyf+IrMn/iKzJ/4isyf+IrMn/iKzJ/4isyf+IrMn/ + h6vH2IenxyAAAAAAAAAAAAAAAAAAAAAAAAAAAKqqqgOKsMuMi7DL/pKmtf+0dkb/t282/7ZuNv+0bTX/ + s2w1/6KIc/+LsMv/i7DM/5G1z/+YudL/l7nR/5G1z/+LsMz/i7DM/4uwzP+LsMz/i7DM/4uwzP+LsMz/ + i7DM/4uwzP6Kr8uRf7+/BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI6z0T2Os87uk67B/7R8UP+6cDf/ + uW83/7dvNv+1bjb/rXpT/5Ktv/+PtdD/lbnT/5q81P+avNX/lbnT/4+10P+PtdD/j7XQ/4+10P+PtdD/ + j7XQ/4+10P+PtdD/jrTQ74+zz0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkbbaDpC40buTt87/ + sIlq/71yOP+7cTj/unA3/7hvN/+2cDn/pY98/5S0yv+YvdX/nL/W/53A1/+YvdX/krnT/5K50/+SudP/ + krnT/5K50/+SudP/krnT/5K50/+RuNK9iLvMDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8B + lbzVY5S81d2nnZLkv3Q6/L5zOf+9cjj/u3E4/7lwN/+2cTz/q4hr/6Ompf+jsLf/o7K5/5+vuP+arLb/ + mqy2/5mstv+ZrLb/mau2/5irtf+Yq7X/l6q0/piosHz/AP8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAACZsswKlL3VH6uWgjHBdTrIwXQ6/8BzOf++cjn/vHI4/7pxOP+5cDf/tnE7/7RzQf+zc0H/ + sXJA/69xQP+ucD//rHA//6tvPv+qbj7/qG0+/6dtPf+mbDz/pWg3i/8AAAEAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAcR1Ok7EdTrqw3U6/8F0Ov+/czn/vXI5/7xxOP+6cDf/ + uG83/7duNv+1bjb/tG01/7JsNf+xazT/r2o0/65pM/+saTP/q2gy/6lnMv+nZTGP/wAAAQAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzGYzBcV3O2vFdjvtxHY7/8J1Ov/AdDr/ + v3M5/71yOP+7cTj/unA3/7hvN/+2bjb/tW02/7NsNf+ybDX/sGs0/69qNP+taTP/rGgz/6lnMY//AAAB + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtm1IB8Z3O17GdzvZ + xXY7/cN1O//CdTr/wHQ5/75zOf+8cjj/u3E4/7lwN/+4bzf/tm42/7RtNf+zbDX/sWs0/7BrNP+uajP/ + rGkzj/8AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + /39/AsVzOSzGdzuNxnc718R2O/XCdDr9wXQ6/r9zOf+9cjn/vHE4/7pxOP+5cDf/t282/7ZuNv+0bTX/ + smw1/7FrNP+uaTOP/wAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAL9/PwTMdzsexng8SMV1OWrCdTl3wXQ5eL5yN3u+cjh/u3E3gLlvN4C3bzWA + t201gLVtNYC0bDZ/sms1e7JqNUP/AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////8AAAAfAAAAH + wAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAH + wAAAB8AAAAfAAAAHwAAAB+AAAA/gAAAP4AAAD/AAAA/8AAAP/gAAD/8AAA//gAAP/+AAD/////8oAAAA + EAAAACAAAAABACAAAAAAAEAEAAAAAAAAAAAAAAAAAAAAAAAAf3//AnObuTNxmLRIcZi0SHGYtEhxmLRI + cZi0SHGYtEhxmLRIcZi0SHGYtEhxmLRIcZi0SHKbtUVymb8UAAAAAH+fvwhul7KxapKr92qSq/dqkqv3 + apKr92qSq/dqkqv3apKr92qSq/dqkqv3apKr92qSq/drlK3vcJi2RgAAAAB/n78Icpq1t2+XsP9vl7D/ + b5ew/2+XsP9vl7D/b5ew/2+XsP9vl7D/b5ew/2+XsP9vl7D/b5ew93SbuEgAAAAAf5+/CHaeubd1nbb/ + dZ22/3Wdtv91nbb/dZ22/3Wdtv91nbb/dZ22/3Wdtv91nbb/dZ22/3Wctvd0n7hIAAAAAH+fvwh6o723 + e6O8/4CZqP+Gioj/fKC2/3ujvP97o7z/e6O8/3ujvP97o7z/e6O8/3ujvP96o7v3eJ+7SAAAAAB/n78I + fqfBt4afrf+XdFb/nGQ1/46EeP+Cprz/ganC/4Gpwv+BqcL/ganC/4Gpwv+BqcL/gKjC93uiv0gAAAAA + f5+/CIehs7eaf2f/o2Uy/6FiL/+dZzn/kI+K/4euxv+Hr8j/h6/I/4evyP+Hr8j/h6/I/4atx/d/psJI + AAAAAH+fvwiIq8C3lKCk/6VtP/+lZTD/nnZU/5Cptv+Rt87/kbjQ/421zv+Ntc7/jbXO/421zv+Lssz3 + f6nCSAAAAAB/n78IibLMt5Wtuv+pcUP/qWcy/6F8Xf+Tt83/p8fb/6fH2/+SutP/kbnS/5G50v+RudL/ + jrbQ94OpxkgAAAAAf6qqBoSrx6qNorL/rXJD/65qM/+ie1v/iKrD/5W2z/+Vts//h6zI/4asyP+GrMj/ + hqzI/4Wrx/OBqcY/AAAAAAAAAACJrclkj6W0+rF1Rv+0bTX/p3xb/4yrxP+Ttc//k7XP/4muyv+Jrsr/ + ia7K/4muyv+JrcrMhabHFwAAAAAAAAAAjrTSIpOuwdu0flT/uXA3/7J1Rf+ZpKr/mLvS/5i81P+Qt9H/ + kLfR/5C30f+QttD9jrTQf39/fwIAAAAAAAAAAH+/vwSWuM5atoRcs75yOP27cTj/tHpN/6yOdf+pkn3/ + pI57/6KNev+hjXr/n4t4+J2JdUwAAAAAAAAAAAAAAAAAAAAAAAAAAMN4PCLDdTrBwHQ5/r5yOf+7cTj/ + t282/7RtNf+xazT/rmoz/6toMvmpaDFOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyXg8JsV3OpzDdDrj + wHQ59LxyN/a5bzb3tm4197NsNPevajPxrWkySwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADakUgH + xXI5KMR1OkHAcjtFu3E4SLhtNUi0bTVIsWszRbZtMBUAAAAAAAAAAAABJgAAASYAAAEmAAABJgAAASYA + AAEmAAABJgAAASYAAAEmAAABJgCAASYAgAEmAIADJgDgAyYA8AMmAPgDJgA= + + + \ No newline at end of file diff --git a/Pilz.Updating.Updater/UpdateInstaller.vb b/Pilz.Updating.Updater/UpdateInstaller.vb new file mode 100644 index 0000000..6daede9 --- /dev/null +++ b/Pilz.Updating.Updater/UpdateInstaller.vb @@ -0,0 +1,115 @@ +Imports System.IO +Imports Newtonsoft.Json.Linq +Imports Pilz.Updating.Model +Imports Pilz.Updating.Scripts + +Public Class UpdateInstaller + + Private restartHostApplication As Boolean + Private autoCloseHostApplication As Boolean + Private packageDir As String + Private appExePath As String + + Private Sub UpdateInstaller_Shown(sender As Object, e As EventArgs) Handles Me.Shown + CheckCommandLines() + + If autoCloseHostApplication Then + CloseHostApplication() + End If + + InstallUpdates() + + If restartHostApplication Then + StartHostApplication() + End If + End Sub + + Private Sub CloseHostApplication() + Dim myProcesses As New List(Of Process) + + For Each p As Process In Process.GetProcesses + If p.MainModule.FileName = appExePath Then + myProcesses.Add(p) + End If + Next + + For Each p As Process In myProcesses + p.Close() + Next + + Dim waited As Byte = 5 + Do While myProcesses.Where(Function(n) Not n.HasExited).Any AndAlso waited > 0 + Sleep(1000) + waited -= 1 + Loop + + For Each p As Process In myProcesses + If Not p.HasExited Then + p.Kill() + End If + Next + End Sub + + Private Sub StartHostApplication() + Process.Start(appExePath) + End Sub + + Private Sub CheckCommandLines() + For Each cmd As String In My.Application.CommandLineArgs + Dim splitted As String() = cmd.Split("#") + + If splitted.Length = 2 Then + Select Case splitted(0).ToLower + Case "restartHostApp".ToLower + restartHostApplication = splitted(1) + Case "autoCloseHostApp".ToLower + autoCloseHostApplication = splitted(1) + Case "updatePackage".ToLower + packageDir = splitted(1) + Case "applicationPath" + appExePath = splitted(1) + End Select + End If + Next + End Sub + + Private Sub InstallUpdates() + Dim packagePath As String = Path.Combine(packageDir, "package.json") + Dim packageFilesDir As String = Path.Combine(packageDir, "files") + Dim systemFilesDir As String = Path.GetDirectoryName(appExePath) + + 'Load update package + Dim package As UpdatePackage = JObject.Parse(File.ReadAllText(packagePath)).ToObject(Of UpdatePackage) + + 'Execute ScriptBefore + ExecuteScriptsWithPriority(ScriptPriority.Before, package.Scripts, systemFilesDir, packageFilesDir) + + 'Update Files + For Each rFile As String In package.Fileupdates + Dim packageFile As String = Path.Combine(packageFilesDir, rFile) + Dim systemFile As String = Path.Combine(systemFilesDir, rFile) + Dim systemFileDir As String = Path.GetDirectoryName(systemFile) + + 'Create destination directory if not exists + If Not Directory.Exists(systemFileDir) Then + Directory.CreateDirectory(systemFileDir) + End If + + 'Copy package file to system file + File.Copy(packageFile, systemFile, True) + Next + + 'ExecuteScriptAfter + ExecuteScriptsWithPriority(ScriptPriority.After, package.Scripts, systemFilesDir, packageFilesDir) + End Sub + + Private Sub ExecuteScriptsWithPriority(priority As ScriptPriority, scripts As IEnumerable(Of Script), applicationPath As String, updatePackagePath As String) + For Each script As Script In scripts + If script.Priority = priority Then + Dim mgr As New ScriptManager(applicationPath, updatePackagePath) + mgr.ExecuteScript(script) + End If + Next + End Sub + +End Class diff --git a/Pilz.Updating.Updater/packages.config b/Pilz.Updating.Updater/packages.config new file mode 100644 index 0000000..93b0be8 --- /dev/null +++ b/Pilz.Updating.Updater/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Pilz.Updating/General.vb b/Pilz.Updating/General.vb new file mode 100644 index 0000000..822d1ef --- /dev/null +++ b/Pilz.Updating/General.vb @@ -0,0 +1,21 @@ +Imports System.IO + +Public Module General + + Public ReadOnly Property MyTempPath As String + Get + Static p As String = String.Empty + + If String.IsNullOrEmpty(p) Then + p = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Pilz.Updating") + + If Not Directory.Exists(p) Then + Directory.CreateDirectory(p) + End If + End If + + Return p + End Get + End Property + +End Module diff --git a/Pilz.Updating/Model/BuildState.vb b/Pilz.Updating/Model/BuildState.vb new file mode 100644 index 0000000..60a6871 --- /dev/null +++ b/Pilz.Updating/Model/BuildState.vb @@ -0,0 +1,10 @@ +Namespace Model + + Public Enum BuildState + Release + ReleaseCandidate + Beta + Alpha + End Enum + +End Namespace diff --git a/Pilz.Updating/Model/CodeLanguage.vb b/Pilz.Updating/Model/CodeLanguage.vb new file mode 100644 index 0000000..66a1911 --- /dev/null +++ b/Pilz.Updating/Model/CodeLanguage.vb @@ -0,0 +1,8 @@ +Namespace Model + + Public Enum CodeLanguage + VB + CSharp + End Enum + +End Namespace diff --git a/Pilz.Updating/Model/UpdateInfo.vb b/Pilz.Updating/Model/UpdateInfo.vb new file mode 100644 index 0000000..ffbcc9f --- /dev/null +++ b/Pilz.Updating/Model/UpdateInfo.vb @@ -0,0 +1,13 @@ +Namespace Model + + Public Class UpdateInfo + + Public Property Name As String + Public Property Version As Version + Public Property State As BuildState + Public Property Build As UInteger + Public Property Changelog As String + + End Class + +End Namespace diff --git a/Pilz.Updating/Model/UpdatePackage.vb b/Pilz.Updating/Model/UpdatePackage.vb new file mode 100644 index 0000000..5978157 --- /dev/null +++ b/Pilz.Updating/Model/UpdatePackage.vb @@ -0,0 +1,12 @@ +Imports Pilz.Updating.Scripts + +Namespace Model + + Public Class UpdatePackage + + Public ReadOnly Property Fileupdates As New List(Of String) + Public ReadOnly Property Scripts As New List(Of Script) + + End Class + +End Namespace diff --git a/Pilz.Updating/My Project/Application.Designer.vb b/Pilz.Updating/My Project/Application.Designer.vb new file mode 100644 index 0000000..88dd01c --- /dev/null +++ b/Pilz.Updating/My Project/Application.Designer.vb @@ -0,0 +1,13 @@ +'------------------------------------------------------------------------------ +' +' 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. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + diff --git a/Pilz.Updating/My Project/Application.myapp b/Pilz.Updating/My Project/Application.myapp new file mode 100644 index 0000000..758895d --- /dev/null +++ b/Pilz.Updating/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + false + false + 0 + true + 0 + 1 + true + diff --git a/Pilz.Updating/My Project/AssemblyInfo.vb b/Pilz.Updating/My Project/AssemblyInfo.vb new file mode 100644 index 0000000..8941d19 --- /dev/null +++ b/Pilz.Updating/My Project/AssemblyInfo.vb @@ -0,0 +1,35 @@ +Imports System +Imports System.Reflection +Imports 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. + +' Werte der Assemblyattribute überprüfen + + + + + + + + + + +'Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird. + + +' 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: +' + + + diff --git a/Pilz.Updating/My Project/Resources.Designer.vb b/Pilz.Updating/My Project/Resources.Designer.vb new file mode 100644 index 0000000..af39fa0 --- /dev/null +++ b/Pilz.Updating/My Project/Resources.Designer.vb @@ -0,0 +1,62 @@ +'------------------------------------------------------------------------------ +' +' 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. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My.Resources + + 'This class was auto-generated by the StronglyTypedResourceBuilder + 'class via a tool like ResGen or Visual Studio. + 'To add or remove a member, edit your .ResX file then rerun ResGen + 'with the /str option, or rebuild your VS project. + ''' + ''' A strongly-typed resource class, for looking up localized strings, etc. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Returns the cached ResourceManager instance used by this class. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("Pilz.Updating.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Overrides the current thread's CurrentUICulture property for all + ''' resource lookups using this strongly typed resource class. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set(ByVal value As Global.System.Globalization.CultureInfo) + resourceCulture = value + End Set + End Property + End Module +End Namespace diff --git a/Pilz.Updating/My Project/Resources.resx b/Pilz.Updating/My Project/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/Pilz.Updating/My Project/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/Pilz.Updating/My Project/Settings.Designer.vb b/Pilz.Updating/My Project/Settings.Designer.vb new file mode 100644 index 0000000..b7968de --- /dev/null +++ b/Pilz.Updating/My Project/Settings.Designer.vb @@ -0,0 +1,73 @@ +'------------------------------------------------------------------------------ +' +' 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. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings), MySettings) + +#Region "My.Settings Auto-Save Functionality" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.Pilz.Updating.My.MySettings + Get + Return Global.Pilz.Updating.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/Pilz.Updating/My Project/Settings.settings b/Pilz.Updating/My Project/Settings.settings new file mode 100644 index 0000000..85b890b --- /dev/null +++ b/Pilz.Updating/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Pilz.Updating/MyEventArgs/UpdatesFoundEventArgs.vb b/Pilz.Updating/MyEventArgs/UpdatesFoundEventArgs.vb new file mode 100644 index 0000000..e3e33c0 --- /dev/null +++ b/Pilz.Updating/MyEventArgs/UpdatesFoundEventArgs.vb @@ -0,0 +1,17 @@ +Imports Pilz.Updating.Model + +Namespace MyEventArgs + + Public Class UpdatesFoundEventArgs + Inherits EventArgs + + Public Property Cancel As Boolean = False + Public Property Updates As UpdateInfo() + + Public Sub New(updates As UpdateInfo()) + Me.Updates = updates + End Sub + + End Class + +End Namespace diff --git a/Pilz.Updating/Pilz.Updating.vbproj b/Pilz.Updating/Pilz.Updating.vbproj new file mode 100644 index 0000000..d024abb --- /dev/null +++ b/Pilz.Updating/Pilz.Updating.vbproj @@ -0,0 +1,119 @@ + + + + + Debug + AnyCPU + {354255D9-9536-4400-B915-FFC49C2CE93F} + Library + Pilz.Updating + Pilz.Updating + 512 + Windows + v4.5 + true + + + true + full + true + true + bin\Debug\ + Pilz.Updating.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + pdbonly + false + true + true + bin\Release\ + Pilz.Updating.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + On + + + Binary + + + Off + + + On + + + + ..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + Application.myapp + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + \ No newline at end of file diff --git a/Pilz.Updating/Scripts/Script.vb b/Pilz.Updating/Scripts/Script.vb new file mode 100644 index 0000000..a7f7ae9 --- /dev/null +++ b/Pilz.Updating/Scripts/Script.vb @@ -0,0 +1,13 @@ +Imports Pilz.Updating.Model + +Namespace Scripts + + Public Class Script + + Public Property Priority As ScriptPriority = ScriptPriority.Before + Public Property Language As CodeLanguage = CodeLanguage.CSharp + Public Property Code As String + + End Class + +End Namespace diff --git a/Pilz.Updating/Scripts/ScriptManager.vb b/Pilz.Updating/Scripts/ScriptManager.vb new file mode 100644 index 0000000..325e310 --- /dev/null +++ b/Pilz.Updating/Scripts/ScriptManager.vb @@ -0,0 +1,71 @@ +Imports System.CodeDom.Compiler +Imports System.Reflection +Imports Microsoft.CSharp +Imports Pilz.Updating.Model +Imports Pilz.Updating.Scripts + +Namespace Scripts + + Public Class ScriptManager + + Public Property ApplicationPath As String + Public Property UpdatePackagePath As String + + Public Sub New(applicationPath As String, updatePackagePath As String) + Me.ApplicationPath = applicationPath + Me.UpdatePackagePath = updatePackagePath + End Sub + + Private Function CompileScript(script As Script) As CompilerResults + Dim provider As CodeDomProvider = Nothing + Dim params As New CompilerParameters + + 'Create code provider + Select Case script.Language + Case CodeLanguage.CSharp + provider = New CSharpCodeProvider + Case CodeLanguage.VB + provider = New VBCodeProvider + End Select + + 'Set general options + params.GenerateExecutable = False + params.GenerateInMemory = True + + 'Set references + params.ReferencedAssemblies.Add() + + 'Compile + Dim res As CompilerResults = provider.CompileAssemblyFromSource(params, script.Code) + + Return res + End Function + + Public Function CheckScriptForErrors(script As Script) As CompilerErrorCollection + Return CompileScript(script).Errors + End Function + + Public Sub ExecuteScript(script As Script) + 'Compile script + Dim res As CompilerResults = CompileScript(script) + + If Not res.Errors.HasErrors Then + 'Get Method + Dim mi As MethodInfo = res.CompiledAssembly.GetType("Program")?.GetMethod("Main") + + If mi IsNot Nothing Then + 'Create params + Dim params As New Dictionary(Of String, String) From { + {"ApplicationPath", ApplicationPath}, + {"UpdatePackagePath", UpdatePackagePath} + } + + 'Execute method + mi.Invoke(Nothing, {params}) + End If + End If + End Sub + + End Class + +End Namespace diff --git a/Pilz.Updating/Scripts/ScriptPriority.vb b/Pilz.Updating/Scripts/ScriptPriority.vb new file mode 100644 index 0000000..f2835a5 --- /dev/null +++ b/Pilz.Updating/Scripts/ScriptPriority.vb @@ -0,0 +1,8 @@ +Namespace Scripts + + Public Enum ScriptPriority + Before + After + End Enum + +End Namespace diff --git a/Pilz.Updating/UpdateManager b/Pilz.Updating/UpdateManager new file mode 100644 index 0000000..875798b --- /dev/null +++ b/Pilz.Updating/UpdateManager @@ -0,0 +1,3 @@ +Public Class Class1 + +End Class diff --git a/Pilz.Updating/Updater.vb b/Pilz.Updating/Updater.vb new file mode 100644 index 0000000..fbd27df --- /dev/null +++ b/Pilz.Updating/Updater.vb @@ -0,0 +1,86 @@ +Imports System.IO +Imports System.IO.Compression +Imports System.Net +Imports System.Reflection +Imports Newtonsoft.Json.Linq +Imports Pilz.Updating.Model +Imports Pilz.Updating.MyEventArgs + +Public Class Updater + + Public Event UpdatesFound(sender As Object, e As UpdatesFoundEventArgs) + Public Event NoUpdatesFound(sender As Object, e As EventArgs) + Public Event UpdateInstallerStarted(Sender As Object, e As EventArgs) + + Public Property InstallAsAdmin As Boolean = True + Public Property RestartHostApplication As Boolean = True + Public Property AutomaticlyCloseHostApplication As Boolean = True + Public Property UpdateDirURL As String + Public Property UpdateInfoURL As String + + Public Sub New(updateUrl As String) + UpdateInfoURL = updateUrl + UpdateDirURL = updateUrl.Remove(updateUrl.LastIndexOf("/"c)) + End Sub + + Public Async Function Update() As Task + Dim wc As New WebClient + Dim updateInstallerZipPath As String = Path.Combine(MyTempPath, "Pilz.Updating.UpdateInstaller.zip") + Dim updateInstallerPath As String = updateInstallerZipPath & "_unpacked" + Dim updateInstallerExePath As String = Path.Combine(updateInstallerPath, "Pilz.Updating.UpdateInstaller.exe") + + 'Clean AppData + For Each dir As String In Directory.GetDirectories(MyTempPath, "*", SearchOption.TopDirectoryOnly) + Directory.Delete(dir, True) + Next + + 'Download UpdateInfos + Dim strUpdateInfos As String = Await wc.DownloadStringTaskAsync(UpdateInfoURL) + Dim updateInfos As UpdateInfo() = JArray.Parse(strUpdateInfos).ToObject(Of UpdateInfo()) + + If updateInfos.Any Then + 'Order update infos from newest to oldest + updateInfos = updateInfos.OrderByDescending( + Function(n) + Return n.Version.ToString & + (Byte.MaxValue - n.State).ToString("X2") & + n.Build.ToString("X4") + End Function).ToArray + + 'Interagate with user + Dim e As New UpdatesFoundEventArgs(updateInfos) + RaiseEvent UpdatesFound(Me, e) + + 'Install updates + If Not e.Cancel Then + Dim updateInfo As UpdateInfo = updateInfos(0) + Dim updatePackageZipFilename As String = $"{updateInfo.Version.ToString} {CByte(updateInfo.State)} {updateInfo.Build}.zip" + Dim updatePackageZipPath As String = Path.Combine(MyTempPath, updatePackageZipFilename) + Dim updatePackagePath As String = updatePackageZipPath & "_unpacked" + + 'Download UpdateInstaller + Await wc.DownloadFileTaskAsync(UpdateDirURL & "/Pilz.Updating.UpdateInstaller.zip", updateInstallerZipPath) + ZipFile.ExtractToDirectory(updateInstallerZipPath, updateInstallerPath) + + 'Download Update Package + Await wc.DownloadFileTaskAsync(UpdateDirURL & "/" & updatePackageZipFilename, updatePackageZipPath) + ZipFile.ExtractToDirectory(updatePackageZipFilename, updatePackagePath) + + 'Build process arguments + Dim applicationExePath As String = Assembly.GetExecutingAssembly.Location + Dim procArgs As String = $"restartHostApp#{RestartHostApplication} autoCloseHostApp#{AutomaticlyCloseHostApplication} ""updatePackage#{updatePackagePath}"" ""applicationPath#{applicationExePath}""" + + 'Finally start update installer to install updates + Process.Start(updateInstallerExePath, procArgs) + + 'Interagate with user + RaiseEvent UpdateInstallerStarted(Me, New EventArgs) + End If + Else + RaiseEvent NoUpdatesFound(Me, New EventArgs) + End If + + wc.Dispose() + End Function + +End Class diff --git a/Pilz.Updating/packages.config b/Pilz.Updating/packages.config new file mode 100644 index 0000000..93b0be8 --- /dev/null +++ b/Pilz.Updating/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Pilz.sln b/Pilz.sln index aba4084..c7094ce 100644 --- a/Pilz.sln +++ b/Pilz.sln @@ -29,6 +29,12 @@ Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Pilz.Simple3DFileParser", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pilz.LicenseHelper", "Pilz.LicenseHelper\Pilz.LicenseHelper.csproj", "{67593FF7-C1D1-4529-98C4-61CBD0615F08}" EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Pilz.Updating", "Pilz.Updating\Pilz.Updating.vbproj", "{354255D9-9536-4400-B915-FFC49C2CE93F}" +EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Pilz.Updating.UpdateInstaller", "Pilz.Updating.Updater\Pilz.Updating.UpdateInstaller.vbproj", "{1BA3D8E8-C514-4182-9E6E-9E6BB7AF0403}" +EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Pilz.Networking", "Pilz.Networking\Pilz.Networking.vbproj", "{4584B121-09C6-40AC-849B-7E410125EF66}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -141,6 +147,30 @@ Global {67593FF7-C1D1-4529-98C4-61CBD0615F08}.Release|Any CPU.Build.0 = Release|Any CPU {67593FF7-C1D1-4529-98C4-61CBD0615F08}.Release|x86.ActiveCfg = Release|Any CPU {67593FF7-C1D1-4529-98C4-61CBD0615F08}.Release|x86.Build.0 = Release|Any CPU + {354255D9-9536-4400-B915-FFC49C2CE93F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {354255D9-9536-4400-B915-FFC49C2CE93F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {354255D9-9536-4400-B915-FFC49C2CE93F}.Debug|x86.ActiveCfg = Debug|Any CPU + {354255D9-9536-4400-B915-FFC49C2CE93F}.Debug|x86.Build.0 = Debug|Any CPU + {354255D9-9536-4400-B915-FFC49C2CE93F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {354255D9-9536-4400-B915-FFC49C2CE93F}.Release|Any CPU.Build.0 = Release|Any CPU + {354255D9-9536-4400-B915-FFC49C2CE93F}.Release|x86.ActiveCfg = Release|Any CPU + {354255D9-9536-4400-B915-FFC49C2CE93F}.Release|x86.Build.0 = Release|Any CPU + {1BA3D8E8-C514-4182-9E6E-9E6BB7AF0403}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1BA3D8E8-C514-4182-9E6E-9E6BB7AF0403}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1BA3D8E8-C514-4182-9E6E-9E6BB7AF0403}.Debug|x86.ActiveCfg = Debug|Any CPU + {1BA3D8E8-C514-4182-9E6E-9E6BB7AF0403}.Debug|x86.Build.0 = Debug|Any CPU + {1BA3D8E8-C514-4182-9E6E-9E6BB7AF0403}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1BA3D8E8-C514-4182-9E6E-9E6BB7AF0403}.Release|Any CPU.Build.0 = Release|Any CPU + {1BA3D8E8-C514-4182-9E6E-9E6BB7AF0403}.Release|x86.ActiveCfg = Release|Any CPU + {1BA3D8E8-C514-4182-9E6E-9E6BB7AF0403}.Release|x86.Build.0 = Release|Any CPU + {4584B121-09C6-40AC-849B-7E410125EF66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4584B121-09C6-40AC-849B-7E410125EF66}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4584B121-09C6-40AC-849B-7E410125EF66}.Debug|x86.ActiveCfg = Debug|Any CPU + {4584B121-09C6-40AC-849B-7E410125EF66}.Debug|x86.Build.0 = Debug|Any CPU + {4584B121-09C6-40AC-849B-7E410125EF66}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4584B121-09C6-40AC-849B-7E410125EF66}.Release|Any CPU.Build.0 = Release|Any CPU + {4584B121-09C6-40AC-849B-7E410125EF66}.Release|x86.ActiveCfg = Release|Any CPU + {4584B121-09C6-40AC-849B-7E410125EF66}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Pilz/HelpfulFunctions.vb b/Pilz/HelpfulFunctions.vb new file mode 100644 index 0000000..1418dd3 --- /dev/null +++ b/Pilz/HelpfulFunctions.vb @@ -0,0 +1,17 @@ +Imports System.Windows.Forms + +Public Module HelpfulFunctions + + Public Sub Sleep(milliseconds As Integer) + Dim stopw As New Stopwatch + + stopw.Start() + + Do While stopw.ElapsedMilliseconds < milliseconds + Application.DoEvents() + Loop + + stopw.Stop() + End Sub + +End Module diff --git a/Pilz/Pilz.vbproj b/Pilz/Pilz.vbproj index d0f8cda..91edc17 100644 --- a/Pilz/Pilz.vbproj +++ b/Pilz/Pilz.vbproj @@ -46,6 +46,7 @@ + @@ -64,6 +65,7 @@ + True diff --git a/Shared Libs/AssimpNet.dll b/Shared Libs/AssimpNet.dll new file mode 100644 index 0000000000000000000000000000000000000000..e20102adffaa7ff3a0240916b046a0d5305ee479 GIT binary patch literal 174080 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%0D+J;-*&x5MDL-D&#bgw3U;1Z8$ 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 hCT&|p%{S2}kIRQHYTol5